SlideShare a Scribd company logo
JavaScript for ABAP Programmers
Functions as 1st Class Citizens
Chris Whealy / The RIG
ABAP
Strongly typed
Syntax similar to COBOL
Block Scope
No equivalent concept
OO using class based inheritance
Imperative programming

JavaScript
Weakly typed
Syntax derived from Java
Lexical Scope
Functions are 1st class citizens
OO using referential inheritance
Imperative or Functional programming
1st Class Functions
Any programming language in which functions are treated as “1st class citizens” is said to implement
“1st class functions”.
So, what does that mean – functions have voting rights?

© 2013 SAP AG. All rights reserved.

3
1st Class Functions
Any programming language in which functions are treated as “1st class citizens” is said to implement
“1st class functions”.
So, what does that mean – functions have voting rights?
No, a 1st class citizen is any object that can be:
 Created or destroyed dynamically

© 2013 SAP AG. All rights reserved.

4
1st Class Functions
Any programming language in which functions are treated as “1st class citizens” is said to implement
“1st class functions”.
So, what does that mean – functions have voting rights?
No, a 1st class citizen is any object that can be:
 Created or destroyed dynamically
 Treated as data, meaning that it can be both:
 Passed as an argument to a function and
 Returned as the result of running a function

© 2013 SAP AG. All rights reserved.

5
1st Class Functions
Any programming language in which functions are treated as “1st class citizens” is said to implement
“1st class functions”.
So, what does that mean – functions have voting rights?
No, a 1st class citizen is any object that can be:
 Created or destroyed dynamically
 Treated as data, meaning that it can be both:
 Passed as an argument to a function and
 Returned as the result of running a function
In JavaScript, all the above statements are applicable to functions because a function is simply an
object “with an executable part”. This means a JavaScript function can be treated either as:
 An object like any other data object, or as
 A executable unit of code

© 2013 SAP AG. All rights reserved.

6
1st Class Functions: Dynamic Creation
A JavaScript function can be created dynamically based on the data available at runtime.
// List of animals and the noises they make
var animalNoises = ["dog","woof","cat","meow","pig","oink","cow","moo"];
// A function that returns a text string describing an animal noise
function noiseMaker(name) {
var n
= animalNoises.indexOf(name);
var noise = (n == -1) ? "a sound I don't know" : animalNoises[n + 1];
return "A " + name + " says " + noise;
}

© 2013 SAP AG. All rights reserved.

7
1st Class Functions: Dynamic Creation
A JavaScript function can be created dynamically based on the data available at runtime.
// List of animals and the noises they make
var animalNoises = ["dog","woof","cat","meow","pig","oink","cow","moo"];
// A function that returns a text string describing an animal noise
function noiseMaker(name) {
var n
= animalNoises.indexOf(name);
var noise = (n == -1) ? "a sound I don't know" : animalNoises[n + 1];
return "A " + name + " says " + noise;
}
// Dynamically create some function objects specific to certain animals
var pigSays
= new Function("alert("" + noiseMaker("pig") + "");");
var sheepSays = new Function("alert("" + noiseMaker("sheep") + "");");

© 2013 SAP AG. All rights reserved.

8
1st Class Functions: Dynamic Creation
A JavaScript function can be created dynamically based on the data available at runtime.
// List of animals and the noises they make
var animalNoises = ["dog","woof","cat","meow","pig","oink","cow","moo"];
// A function that returns a text string describing an animal noise
function noiseMaker(name) {
var n
= animalNoises.indexOf(name);
var noise = (n == -1) ? "a sound I don't know" : animalNoises[n + 1];
return "A " + name + " says " + noise;
}
// Dynamically create some function objects specific to certain animals
var pigSays
= new Function("alert("" + noiseMaker("pig") + "");");
var sheepSays = new Function("alert("" + noiseMaker("sheep") + "");");
// Call these dynamically created function objects using the invocation operator
pigSays();

© 2013 SAP AG. All rights reserved.

9
1st Class Functions: Dynamic Creation
A JavaScript function can be created dynamically based on the data available at runtime.
// List of animals and the noises they make
var animalNoises = ["dog","woof","cat","meow","pig","oink","cow","moo"];
// A function that returns a text string describing an animal noise
function noiseMaker(name) {
var n
= animalNoises.indexOf(name);
var noise = (n == -1) ? "a sound I don't know" : animalNoises[n + 1];
return "A " + name + " says " + noise;
}
// Dynamically create some function objects specific to certain animals
var pigSays
= new Function("alert("" + noiseMaker("pig") + "");");
var sheepSays = new Function("alert("" + noiseMaker("sheep") + "");");
// Call these dynamically created function objects using the invocation operator
pigSays();
sheepSays();
© 2013 SAP AG. All rights reserved.

10
1st Class Functions: Dynamic Destruction
Setting a function object to null destroys that object.
// Destroy the dynamically created function objects
pigSays
= null;
sheepSays = null;

Notice here that reference is made to the function object itself, not the result of invoking that function.
In other words, the invocation operator () must not be used.

© 2013 SAP AG. All rights reserved.

11
1st Class Functions: Functions as Arguments
Since JavaScript treats a function is an object, the functions created in the previous example can be
passed as parameters in the same way you would pass an object containing only data.
// A function that will execute any number of functions it is passed
function noisyFarmyard() {
// Did we receive any parameters?
if (arguments.length > 0) {
// Loop around those parameters checking to see if any of them are of type ‘function’
for (var i=0; i<arguments.length; i++) {
if (typeof arguments[i] === 'function') {
arguments[i]();
}
}
}
}
noisyFarmyard(pigSays, sheepSays);

© 2013 SAP AG. All rights reserved.

Function objects can be passed as
arguments just like any other object

12
1st Class Functions: Functions as Arguments
Since JavaScript treats a function is an object, the functions created in the previous example can be
passed as parameters in the same way you would pass an object containing only data.
// A function that will execute any number of functions it is passed
function noisyFarmyard() {
// Did we receive any parameters?
if (arguments.length > 0) {
// Loop around those parameters checking to see if any of them are of type ‘function’
for (var i=0; i<arguments.length; i++) {
if (typeof arguments[i] === 'function') {
arguments[i]();
}
Because we test the data type of each
}
argument, we can determine whether the value
}
we’ve been passed is executable or not
}
noisyFarmyard(pigSays, sheepSays);

© 2013 SAP AG. All rights reserved.

13
1st Class Functions: Functions as Return Values 1/2
Having a function that returns a function is powerful tool for abstraction. Instead of a function returning
the required value, it returns a function that must be executed to obtain the required value.
// A function that works out how many animal functions have been created
function animalList() {
var listOfAnimals = [];
// Check whether a function has been created for each animal
for (var i=0; i<animalNoises.length; i=i+2) {
var fName = animalNoises[i]+"Says";

if (typeof window[fName] === 'function') {
listOfAnimals.push(fName);
}
}
return function() {
return listOfAnimals;
}

Using the array syntax for accessing an object
property, we can check whether the required
function not only exists within the Global Object,
but is also of type 'function'

}
© 2013 SAP AG. All rights reserved.

14
1st Class Functions: Functions as Return Values 1/2
Having a function that returns a function is powerful tool for abstraction. Instead of a function returning
the required value, it returns a function that must be executed to obtain the required value.
// A function that works out how many animal functions have been created
function animalList() {
var listOfAnimals = [];
// Check whether a function has been created for each animal
for (var i=0; i<animalNoises.length; i=i+2) {
var fName = animalNoises[i]+"Says";

if (typeof window[fName] === 'function') {
listOfAnimals.push(fName);
}
}
return function() {
return listOfAnimals;
}

Here, we return a function which when invoked,
will return the array called listOfAnimals

}
© 2013 SAP AG. All rights reserved.

15
1st Class Functions: Functions as Return Values 2/2
Once this function is called, it doesn't return the data we require; instead, it returns a function that
when called, will return the required data.
// A function that works out how many animal functions have been created
function animalList() {
... snip ...
}
// The call to function animalList() returns a function object. So 'animalListFunction' is
// not the data we want, but a function that when executed, will generate the data we want.
var animalListFunction = animalList();

© 2013 SAP AG. All rights reserved.

16
1st Class Functions: Functions as Return Values 2/2
Once this function is called, it doesn't return the data we require; instead, it returns a function that
when called, will return the required data.
// A function that works out how many animal functions have been created
function animalList() {
... snip ...
}
// The call to function animalList() returns a function object. So 'animalListFunction' is
// not the data we want, but a function that when executed, will generate the data we want.
var animalListFunction = animalList();

// 'animalListFunction' must now be executed using the invocation operator.
animalListFunction(); //  ["pigSays","sheepSays"]

© 2013 SAP AG. All rights reserved.

17

More Related Content

What's hot (20)

Advance JS and oop
Advance JS and oop
Abuzer Firdousi
 
Functional Programming in JavaScript by Luis Atencio
Functional Programming in JavaScript by Luis Atencio
Luis Atencio
 
Java ap is you should know
Java ap is you should know
Hendrik Ebbers
 
Let's JavaScript
Let's JavaScript
Paweł Dorofiejczyk
 
Save time with kotlin in android development
Save time with kotlin in android development
Adit Lal
 
Practical tips for building apps with kotlin
Practical tips for building apps with kotlin
Adit Lal
 
Arguments Object in JavaScript
Arguments Object in JavaScript
Ideas2IT Technologies
 
Project Lambda: Evolution of Java
Project Lambda: Evolution of Java
Can Pekdemir
 
What's in Kotlin for us - Alexandre Greschon, MyHeritage
What's in Kotlin for us - Alexandre Greschon, MyHeritage
DroidConTLV
 
Partial Functions in Scala
Partial Functions in Scala
BoldRadius Solutions
 
Journey's End – Collection and Reduction in the Stream API
Journey's End – Collection and Reduction in the Stream API
Maurice Naftalin
 
Functors, Applicatives and Monads In Scala
Functors, Applicatives and Monads In Scala
Knoldus Inc.
 
06. operator overloading
06. operator overloading
Haresh Jaiswal
 
Reactive Programming with JavaScript
Reactive Programming with JavaScript
Codemotion
 
Splat
Splat
Lee Wei Yeong
 
Cocoa heads 09112017
Cocoa heads 09112017
Vincent Pradeilles
 
Building Mobile Apps with Android
Building Mobile Apps with Android
Kurt Renzo Acosta
 
Javascript And J Query
Javascript And J Query
itsarsalan
 
The Bestiary of Pure Functional Programming
The Bestiary of Pure Functional Programming
Garth Gilmour
 
Advanced functional programing in Swift
Advanced functional programing in Swift
Vincent Pradeilles
 
Functional Programming in JavaScript by Luis Atencio
Functional Programming in JavaScript by Luis Atencio
Luis Atencio
 
Java ap is you should know
Java ap is you should know
Hendrik Ebbers
 
Save time with kotlin in android development
Save time with kotlin in android development
Adit Lal
 
Practical tips for building apps with kotlin
Practical tips for building apps with kotlin
Adit Lal
 
Project Lambda: Evolution of Java
Project Lambda: Evolution of Java
Can Pekdemir
 
What's in Kotlin for us - Alexandre Greschon, MyHeritage
What's in Kotlin for us - Alexandre Greschon, MyHeritage
DroidConTLV
 
Journey's End – Collection and Reduction in the Stream API
Journey's End – Collection and Reduction in the Stream API
Maurice Naftalin
 
Functors, Applicatives and Monads In Scala
Functors, Applicatives and Monads In Scala
Knoldus Inc.
 
06. operator overloading
06. operator overloading
Haresh Jaiswal
 
Reactive Programming with JavaScript
Reactive Programming with JavaScript
Codemotion
 
Building Mobile Apps with Android
Building Mobile Apps with Android
Kurt Renzo Acosta
 
Javascript And J Query
Javascript And J Query
itsarsalan
 
The Bestiary of Pure Functional Programming
The Bestiary of Pure Functional Programming
Garth Gilmour
 
Advanced functional programing in Swift
Advanced functional programing in Swift
Vincent Pradeilles
 

Similar to JavaScript for ABAP Programmers - 5/7 Functions (20)

Dev Concepts: Functional Programming
Dev Concepts: Functional Programming
Svetlin Nakov
 
Basic Javascript
Basic Javascript
Bunlong Van
 
JavaScript Introductin to Functions
JavaScript Introductin to Functions
Charles Russell
 
25-functions.ppt
25-functions.ppt
JyothiAmpally
 
Functional programming
Functional programming
S M Asaduzzaman
 
LinkedIn TBC JavaScript 100: Intro
LinkedIn TBC JavaScript 100: Intro
Adam Crabtree
 
JavaScript Functions
JavaScript Functions
Colin DeCarlo
 
Javascript for the c# developer
Javascript for the c# developer
Salvatore Fazio
 
Javascript basics
Javascript basics
Solv AS
 
Functional JavaScript Fundamentals
Functional JavaScript Fundamentals
Srdjan Strbanovic
 
The JavaScript Programming Language
The JavaScript Programming Language
Mohammed Irfan Shaikh
 
Js in-ten-minutes
Js in-ten-minutes
Phong Vân
 
Awesomeness of JavaScript…almost
Awesomeness of JavaScript…almost
Quinton Sheppard
 
Javascript development done right
Javascript development done right
Pawel Szulc
 
Functions - complex first class citizen
Functions - complex first class citizen
Vytautas Butkus
 
11_Functions_Introduction.pptx javascript notes
11_Functions_Introduction.pptx javascript notes
tayyabbiswas2025
 
Scala qq
Scala qq
羽祈 張
 
Introduction to Functional Programming
Introduction to Functional Programming
Hoàng Lâm Huỳnh
 
JavaScript For CSharp Developer
JavaScript For CSharp Developer
Sarvesh Kushwaha
 
java script functions, classes
java script functions, classes
Vijay Kalyan
 
Dev Concepts: Functional Programming
Dev Concepts: Functional Programming
Svetlin Nakov
 
Basic Javascript
Basic Javascript
Bunlong Van
 
JavaScript Introductin to Functions
JavaScript Introductin to Functions
Charles Russell
 
LinkedIn TBC JavaScript 100: Intro
LinkedIn TBC JavaScript 100: Intro
Adam Crabtree
 
JavaScript Functions
JavaScript Functions
Colin DeCarlo
 
Javascript for the c# developer
Javascript for the c# developer
Salvatore Fazio
 
Javascript basics
Javascript basics
Solv AS
 
Functional JavaScript Fundamentals
Functional JavaScript Fundamentals
Srdjan Strbanovic
 
Js in-ten-minutes
Js in-ten-minutes
Phong Vân
 
Awesomeness of JavaScript…almost
Awesomeness of JavaScript…almost
Quinton Sheppard
 
Javascript development done right
Javascript development done right
Pawel Szulc
 
Functions - complex first class citizen
Functions - complex first class citizen
Vytautas Butkus
 
11_Functions_Introduction.pptx javascript notes
11_Functions_Introduction.pptx javascript notes
tayyabbiswas2025
 
Introduction to Functional Programming
Introduction to Functional Programming
Hoàng Lâm Huỳnh
 
JavaScript For CSharp Developer
JavaScript For CSharp Developer
Sarvesh Kushwaha
 
java script functions, classes
java script functions, classes
Vijay Kalyan
 
Ad

More from Chris Whealy (8)

SAP Kapsel Plugins For Cordova
SAP Kapsel Plugins For Cordova
Chris Whealy
 
Introduction to SAP Gateway and OData
Introduction to SAP Gateway and OData
Chris Whealy
 
JavaScript for ABAP Programmers - 7/7 Functional Programming
JavaScript for ABAP Programmers - 7/7 Functional Programming
Chris Whealy
 
JavaScript for ABAP Programmers - 6/7 Inheritance
JavaScript for ABAP Programmers - 6/7 Inheritance
Chris Whealy
 
JavaScript for ABAP Programmers - 4/7 Scope
JavaScript for ABAP Programmers - 4/7 Scope
Chris Whealy
 
JavaScript for ABAP Programmers - 3/7 Syntax
JavaScript for ABAP Programmers - 3/7 Syntax
Chris Whealy
 
JavaScript for ABAP Programmers - 2/7 Data Types
JavaScript for ABAP Programmers - 2/7 Data Types
Chris Whealy
 
JavaScript for ABAP Programmers - 1/7 Introduction
JavaScript for ABAP Programmers - 1/7 Introduction
Chris Whealy
 
SAP Kapsel Plugins For Cordova
SAP Kapsel Plugins For Cordova
Chris Whealy
 
Introduction to SAP Gateway and OData
Introduction to SAP Gateway and OData
Chris Whealy
 
JavaScript for ABAP Programmers - 7/7 Functional Programming
JavaScript for ABAP Programmers - 7/7 Functional Programming
Chris Whealy
 
JavaScript for ABAP Programmers - 6/7 Inheritance
JavaScript for ABAP Programmers - 6/7 Inheritance
Chris Whealy
 
JavaScript for ABAP Programmers - 4/7 Scope
JavaScript for ABAP Programmers - 4/7 Scope
Chris Whealy
 
JavaScript for ABAP Programmers - 3/7 Syntax
JavaScript for ABAP Programmers - 3/7 Syntax
Chris Whealy
 
JavaScript for ABAP Programmers - 2/7 Data Types
JavaScript for ABAP Programmers - 2/7 Data Types
Chris Whealy
 
JavaScript for ABAP Programmers - 1/7 Introduction
JavaScript for ABAP Programmers - 1/7 Introduction
Chris Whealy
 
Ad

Recently uploaded (20)

Viral>Wondershare Filmora 14.5.18.12900 Crack Free Download
Viral>Wondershare Filmora 14.5.18.12900 Crack Free Download
Puppy jhon
 
The State of Web3 Industry- Industry Report
The State of Web3 Industry- Industry Report
Liveplex
 
FIDO Seminar: Perspectives on Passkeys & Consumer Adoption.pptx
FIDO Seminar: Perspectives on Passkeys & Consumer Adoption.pptx
FIDO Alliance
 
FME for Distribution & Transmission Integrity Management Program (DIMP & TIMP)
FME for Distribution & Transmission Integrity Management Program (DIMP & TIMP)
Safe Software
 
MuleSoft for AgentForce : Topic Center and API Catalog
MuleSoft for AgentForce : Topic Center and API Catalog
shyamraj55
 
Integration of Utility Data into 3D BIM Models Using a 3D Solids Modeling Wor...
Integration of Utility Data into 3D BIM Models Using a 3D Solids Modeling Wor...
Safe Software
 
Artificial Intelligence in the Nonprofit Boardroom.pdf
Artificial Intelligence in the Nonprofit Boardroom.pdf
OnBoard
 
Crypto Super 500 - 14th Report - June2025.pdf
Crypto Super 500 - 14th Report - June2025.pdf
Stephen Perrenod
 
cnc-drilling-dowel-inserting-machine-drillteq-d-510-english.pdf
cnc-drilling-dowel-inserting-machine-drillteq-d-510-english.pdf
AmirStern2
 
June Patch Tuesday
June Patch Tuesday
Ivanti
 
Scaling GenAI Inference From Prototype to Production: Real-World Lessons in S...
Scaling GenAI Inference From Prototype to Production: Real-World Lessons in S...
Anish Kumar
 
High Availability On-Premises FME Flow.pdf
High Availability On-Premises FME Flow.pdf
Safe Software
 
Oracle Cloud and AI Specialization Program
Oracle Cloud and AI Specialization Program
VICTOR MAESTRE RAMIREZ
 
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
NTT DATA Technology & Innovation
 
Providing an OGC API Processes REST Interface for FME Flow
Providing an OGC API Processes REST Interface for FME Flow
Safe Software
 
FIDO Seminar: Targeting Trust: The Future of Identity in the Workforce.pptx
FIDO Seminar: Targeting Trust: The Future of Identity in the Workforce.pptx
FIDO Alliance
 
ENERGY CONSUMPTION CALCULATION IN ENERGY-EFFICIENT AIR CONDITIONER.pdf
ENERGY CONSUMPTION CALCULATION IN ENERGY-EFFICIENT AIR CONDITIONER.pdf
Muhammad Rizwan Akram
 
Data Validation and System Interoperability
Data Validation and System Interoperability
Safe Software
 
FME for Good: Integrating Multiple Data Sources with APIs to Support Local Ch...
FME for Good: Integrating Multiple Data Sources with APIs to Support Local Ch...
Safe Software
 
“Addressing Evolving AI Model Challenges Through Memory and Storage,” a Prese...
“Addressing Evolving AI Model Challenges Through Memory and Storage,” a Prese...
Edge AI and Vision Alliance
 
Viral>Wondershare Filmora 14.5.18.12900 Crack Free Download
Viral>Wondershare Filmora 14.5.18.12900 Crack Free Download
Puppy jhon
 
The State of Web3 Industry- Industry Report
The State of Web3 Industry- Industry Report
Liveplex
 
FIDO Seminar: Perspectives on Passkeys & Consumer Adoption.pptx
FIDO Seminar: Perspectives on Passkeys & Consumer Adoption.pptx
FIDO Alliance
 
FME for Distribution & Transmission Integrity Management Program (DIMP & TIMP)
FME for Distribution & Transmission Integrity Management Program (DIMP & TIMP)
Safe Software
 
MuleSoft for AgentForce : Topic Center and API Catalog
MuleSoft for AgentForce : Topic Center and API Catalog
shyamraj55
 
Integration of Utility Data into 3D BIM Models Using a 3D Solids Modeling Wor...
Integration of Utility Data into 3D BIM Models Using a 3D Solids Modeling Wor...
Safe Software
 
Artificial Intelligence in the Nonprofit Boardroom.pdf
Artificial Intelligence in the Nonprofit Boardroom.pdf
OnBoard
 
Crypto Super 500 - 14th Report - June2025.pdf
Crypto Super 500 - 14th Report - June2025.pdf
Stephen Perrenod
 
cnc-drilling-dowel-inserting-machine-drillteq-d-510-english.pdf
cnc-drilling-dowel-inserting-machine-drillteq-d-510-english.pdf
AmirStern2
 
June Patch Tuesday
June Patch Tuesday
Ivanti
 
Scaling GenAI Inference From Prototype to Production: Real-World Lessons in S...
Scaling GenAI Inference From Prototype to Production: Real-World Lessons in S...
Anish Kumar
 
High Availability On-Premises FME Flow.pdf
High Availability On-Premises FME Flow.pdf
Safe Software
 
Oracle Cloud and AI Specialization Program
Oracle Cloud and AI Specialization Program
VICTOR MAESTRE RAMIREZ
 
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
NTT DATA Technology & Innovation
 
Providing an OGC API Processes REST Interface for FME Flow
Providing an OGC API Processes REST Interface for FME Flow
Safe Software
 
FIDO Seminar: Targeting Trust: The Future of Identity in the Workforce.pptx
FIDO Seminar: Targeting Trust: The Future of Identity in the Workforce.pptx
FIDO Alliance
 
ENERGY CONSUMPTION CALCULATION IN ENERGY-EFFICIENT AIR CONDITIONER.pdf
ENERGY CONSUMPTION CALCULATION IN ENERGY-EFFICIENT AIR CONDITIONER.pdf
Muhammad Rizwan Akram
 
Data Validation and System Interoperability
Data Validation and System Interoperability
Safe Software
 
FME for Good: Integrating Multiple Data Sources with APIs to Support Local Ch...
FME for Good: Integrating Multiple Data Sources with APIs to Support Local Ch...
Safe Software
 
“Addressing Evolving AI Model Challenges Through Memory and Storage,” a Prese...
“Addressing Evolving AI Model Challenges Through Memory and Storage,” a Prese...
Edge AI and Vision Alliance
 

JavaScript for ABAP Programmers - 5/7 Functions

  • 1. JavaScript for ABAP Programmers Functions as 1st Class Citizens Chris Whealy / The RIG
  • 2. ABAP Strongly typed Syntax similar to COBOL Block Scope No equivalent concept OO using class based inheritance Imperative programming JavaScript Weakly typed Syntax derived from Java Lexical Scope Functions are 1st class citizens OO using referential inheritance Imperative or Functional programming
  • 3. 1st Class Functions Any programming language in which functions are treated as “1st class citizens” is said to implement “1st class functions”. So, what does that mean – functions have voting rights? © 2013 SAP AG. All rights reserved. 3
  • 4. 1st Class Functions Any programming language in which functions are treated as “1st class citizens” is said to implement “1st class functions”. So, what does that mean – functions have voting rights? No, a 1st class citizen is any object that can be:  Created or destroyed dynamically © 2013 SAP AG. All rights reserved. 4
  • 5. 1st Class Functions Any programming language in which functions are treated as “1st class citizens” is said to implement “1st class functions”. So, what does that mean – functions have voting rights? No, a 1st class citizen is any object that can be:  Created or destroyed dynamically  Treated as data, meaning that it can be both:  Passed as an argument to a function and  Returned as the result of running a function © 2013 SAP AG. All rights reserved. 5
  • 6. 1st Class Functions Any programming language in which functions are treated as “1st class citizens” is said to implement “1st class functions”. So, what does that mean – functions have voting rights? No, a 1st class citizen is any object that can be:  Created or destroyed dynamically  Treated as data, meaning that it can be both:  Passed as an argument to a function and  Returned as the result of running a function In JavaScript, all the above statements are applicable to functions because a function is simply an object “with an executable part”. This means a JavaScript function can be treated either as:  An object like any other data object, or as  A executable unit of code © 2013 SAP AG. All rights reserved. 6
  • 7. 1st Class Functions: Dynamic Creation A JavaScript function can be created dynamically based on the data available at runtime. // List of animals and the noises they make var animalNoises = ["dog","woof","cat","meow","pig","oink","cow","moo"]; // A function that returns a text string describing an animal noise function noiseMaker(name) { var n = animalNoises.indexOf(name); var noise = (n == -1) ? "a sound I don't know" : animalNoises[n + 1]; return "A " + name + " says " + noise; } © 2013 SAP AG. All rights reserved. 7
  • 8. 1st Class Functions: Dynamic Creation A JavaScript function can be created dynamically based on the data available at runtime. // List of animals and the noises they make var animalNoises = ["dog","woof","cat","meow","pig","oink","cow","moo"]; // A function that returns a text string describing an animal noise function noiseMaker(name) { var n = animalNoises.indexOf(name); var noise = (n == -1) ? "a sound I don't know" : animalNoises[n + 1]; return "A " + name + " says " + noise; } // Dynamically create some function objects specific to certain animals var pigSays = new Function("alert("" + noiseMaker("pig") + "");"); var sheepSays = new Function("alert("" + noiseMaker("sheep") + "");"); © 2013 SAP AG. All rights reserved. 8
  • 9. 1st Class Functions: Dynamic Creation A JavaScript function can be created dynamically based on the data available at runtime. // List of animals and the noises they make var animalNoises = ["dog","woof","cat","meow","pig","oink","cow","moo"]; // A function that returns a text string describing an animal noise function noiseMaker(name) { var n = animalNoises.indexOf(name); var noise = (n == -1) ? "a sound I don't know" : animalNoises[n + 1]; return "A " + name + " says " + noise; } // Dynamically create some function objects specific to certain animals var pigSays = new Function("alert("" + noiseMaker("pig") + "");"); var sheepSays = new Function("alert("" + noiseMaker("sheep") + "");"); // Call these dynamically created function objects using the invocation operator pigSays(); © 2013 SAP AG. All rights reserved. 9
  • 10. 1st Class Functions: Dynamic Creation A JavaScript function can be created dynamically based on the data available at runtime. // List of animals and the noises they make var animalNoises = ["dog","woof","cat","meow","pig","oink","cow","moo"]; // A function that returns a text string describing an animal noise function noiseMaker(name) { var n = animalNoises.indexOf(name); var noise = (n == -1) ? "a sound I don't know" : animalNoises[n + 1]; return "A " + name + " says " + noise; } // Dynamically create some function objects specific to certain animals var pigSays = new Function("alert("" + noiseMaker("pig") + "");"); var sheepSays = new Function("alert("" + noiseMaker("sheep") + "");"); // Call these dynamically created function objects using the invocation operator pigSays(); sheepSays(); © 2013 SAP AG. All rights reserved. 10
  • 11. 1st Class Functions: Dynamic Destruction Setting a function object to null destroys that object. // Destroy the dynamically created function objects pigSays = null; sheepSays = null; Notice here that reference is made to the function object itself, not the result of invoking that function. In other words, the invocation operator () must not be used. © 2013 SAP AG. All rights reserved. 11
  • 12. 1st Class Functions: Functions as Arguments Since JavaScript treats a function is an object, the functions created in the previous example can be passed as parameters in the same way you would pass an object containing only data. // A function that will execute any number of functions it is passed function noisyFarmyard() { // Did we receive any parameters? if (arguments.length > 0) { // Loop around those parameters checking to see if any of them are of type ‘function’ for (var i=0; i<arguments.length; i++) { if (typeof arguments[i] === 'function') { arguments[i](); } } } } noisyFarmyard(pigSays, sheepSays); © 2013 SAP AG. All rights reserved. Function objects can be passed as arguments just like any other object 12
  • 13. 1st Class Functions: Functions as Arguments Since JavaScript treats a function is an object, the functions created in the previous example can be passed as parameters in the same way you would pass an object containing only data. // A function that will execute any number of functions it is passed function noisyFarmyard() { // Did we receive any parameters? if (arguments.length > 0) { // Loop around those parameters checking to see if any of them are of type ‘function’ for (var i=0; i<arguments.length; i++) { if (typeof arguments[i] === 'function') { arguments[i](); } Because we test the data type of each } argument, we can determine whether the value } we’ve been passed is executable or not } noisyFarmyard(pigSays, sheepSays); © 2013 SAP AG. All rights reserved. 13
  • 14. 1st Class Functions: Functions as Return Values 1/2 Having a function that returns a function is powerful tool for abstraction. Instead of a function returning the required value, it returns a function that must be executed to obtain the required value. // A function that works out how many animal functions have been created function animalList() { var listOfAnimals = []; // Check whether a function has been created for each animal for (var i=0; i<animalNoises.length; i=i+2) { var fName = animalNoises[i]+"Says"; if (typeof window[fName] === 'function') { listOfAnimals.push(fName); } } return function() { return listOfAnimals; } Using the array syntax for accessing an object property, we can check whether the required function not only exists within the Global Object, but is also of type 'function' } © 2013 SAP AG. All rights reserved. 14
  • 15. 1st Class Functions: Functions as Return Values 1/2 Having a function that returns a function is powerful tool for abstraction. Instead of a function returning the required value, it returns a function that must be executed to obtain the required value. // A function that works out how many animal functions have been created function animalList() { var listOfAnimals = []; // Check whether a function has been created for each animal for (var i=0; i<animalNoises.length; i=i+2) { var fName = animalNoises[i]+"Says"; if (typeof window[fName] === 'function') { listOfAnimals.push(fName); } } return function() { return listOfAnimals; } Here, we return a function which when invoked, will return the array called listOfAnimals } © 2013 SAP AG. All rights reserved. 15
  • 16. 1st Class Functions: Functions as Return Values 2/2 Once this function is called, it doesn't return the data we require; instead, it returns a function that when called, will return the required data. // A function that works out how many animal functions have been created function animalList() { ... snip ... } // The call to function animalList() returns a function object. So 'animalListFunction' is // not the data we want, but a function that when executed, will generate the data we want. var animalListFunction = animalList(); © 2013 SAP AG. All rights reserved. 16
  • 17. 1st Class Functions: Functions as Return Values 2/2 Once this function is called, it doesn't return the data we require; instead, it returns a function that when called, will return the required data. // A function that works out how many animal functions have been created function animalList() { ... snip ... } // The call to function animalList() returns a function object. So 'animalListFunction' is // not the data we want, but a function that when executed, will generate the data we want. var animalListFunction = animalList(); // 'animalListFunction' must now be executed using the invocation operator. animalListFunction(); //  ["pigSays","sheepSays"] © 2013 SAP AG. All rights reserved. 17