立即执行函数
我们可以立即执行一个函数,在定义它之后。只需将函数包裹在括号()中并调用它。
(function myData() { console.log("myData was executed!"); })();
立即执行的函数创建一个新的变量作用域。if,else或while不会在JavaScript中创建新的变量作用域。
var myData = 123; if (true) { var myData = 456; } console.log(myData); // 456;
在JavaScript中创建新的变量作用域的唯一推荐方法是使用函数。下面的代码显示了如何使用立即执行的函数创建一个新的变量范围。
var myData = 123; if (true) { (function () { // create a new scope var myData = 456; })(); } console.log(myData); // 123;
匿名函数
没有名称的函数称为匿名函数。在JavaScript中,可以将函数分配给变量。如果你要使用一个函数作为一个变量,你不需要命名该函数。
下面的代码显示了两个定义函数内联的方法。这两种方法都是等效的。
var foo1 = function namedFunction() { console.log("foo1"); } /*www.w3cschool.cn*/foo1(); // foo1 var foo2 = function () { // no function name i.e. anonymous function console.log("foo2"); } foo2(); // foo2
如果一个函数的处理方式与语言中任何其他变量的处理方式相同,那这种编程语言被称为具有一流功能。而JavaScript具有一流的功能。
高阶函数
由于JavaScript允许我们为变量赋值函数,我们可以将函数传递给其他函数。将函数作为参数的函数称为高阶函数。高阶函数的一个非常常见的例子是setTimeout。
以下代码显示如何使用setTimeout函数。
setTimeout(function () { console.log("2000 milliseconds have passed since this demo started"); }, 2000);
如果在Node.js中运行此应用程序,你会在两秒后看到console.log消息然后应用程序将退出。我们使用一个匿名函数作为setTimeout的第一个参数。这使得setTimeout是一个高阶函数。我们可以创建一个函数并传入。
function foo() { console.log("2000 milliseconds have passed since this demo started"); } setTimeout(foo, 2000);
Closure
如果在另一个函数内定义了一个函数,内部函数可以访问在外部函数中声明的变量。外部函数中的变量已经被内部函数关闭。这个概念本身是足够简单和直观的。
function outerFunction(arg) { var variableInOuterFunction = arg; function myValue() { console.log(variableInOuterFunction); } myValue(); } outerFunction("hello closure!"); // logs hello closure!
内部函数可以从外部范围访问变量,即使在外部函数已返回时。因为变量仍然在内部函数中绑定,而不依赖于外部函数。
function outerFunction(arg) { var variableInOuterFunction = arg; return function () { console.log(variableInOuterFunction); } } var innerFunction = outerFunction("hello closure!"); innerFunction();