javascript匿名函数与闭包

javascript匿名函数与闭包

匿名函数

1.就是没有名字的函数

(function(x, y){
    alert(x + y);
})(2, 3);

创建了一个匿名函数(在第一个括号内),第二个括号用于调用该匿名函数,并传入参数。

闭包

1.使用闭包可以大大减少我们的代码量,使我们的代码看上去更加清晰等等,总之功能十分强大。

2.闭包说白了就是函数的嵌套,内层的函数可以使用外层函数的所有变量,即使外层函数已经执行完毕(这点涉及JavaScript作用域链)。

JavaScript自由变量

1.在A作用域中使用的变量x,却没有在A作用域中声明(即在其他作用域中声明的),对于A作用域来说,x就是一个自由变量。如下图:

2.要到创建这个函数的那个作用域中取值,(是“创建”,而不是“调用”),如:

var x=10;
function fn(){
	console.log(x);
}

function show(f){
	var x=20;

	(function(){
		f();
	})();
}

show(fn); //创建fn时,是在x=10的下一级作用域链中进行创建的

高阶函数

1.返回另一个函数的函数称为高阶函数

2.内部函数在没有任何局部声明之前(既不是被传入,也不是局部声明)使用的变量就是被捕获的变量。

3.变量的捕获发生在创建闭包的时候

function makeAdder(captured) {
    return function(free) {
        var ret = free + captured;
        console.log(ret);
    }
}

var add10 = makeAdder(10);

add10(2); // 输出:12

1.外部函数中的变量captured被执行加法的返回函数捕获,内部函数从未声明过captured变量,却可以引用它。

2.要到创建这个函数的那个作用域中取值,(是“创建”,而不是“调用”)

var a = 10;
function fn() {
    var b = 20;
    function bar() {
        console.log(a + b);
    }
    return bar;
}
var x = fn();
b = 200;
x(); //30

创建时a=10,b=20

参考原文:http://www.cnblogs.com/wangfupeng1988/p/3992795.html