什么是闭包,闭包的定义是什么
函数和其本身对周围状态的引用两者捆绑在一起构成闭包。也即是说闭包可以从函数内部访问外部的作用域,在js中,每当函数创建时,就会在函数生成时生成闭包。
闭包是js函数作用域的副产品,正是由于JS函数内部可以访问函数外部变量的设定符合了闭包的定义,所以才会有了闭包。
闭包是什么样子的
eg.1:
var name = 'zhang san';
function show() {
console.log(show);
}
show() // zhang san
以上例子完全满足闭包的定义:函数内部可以访问函数外部的变量,这就是一个简单的闭包。
eg.2:
function foo(){
var local = 1
function bar(){
local++
return local
}
return bar
}
var func = foo()
func() // 2
上面这个是创建闭包的常见方式,即在一个函数内部创建另一个函数;
在这上面函数bar与变量local组成了一个闭包;
函数bar,return出来,是为了能够在函数foo外能够访问函数bar;如果不return出来,在函数foo外就无法使用这个函数,把return改为window.bar=bar是一样的;所以return bar只是为了bar能被使用,和闭包无关。
eg.3:
var foo = {};
// 初始化
(function (object) {
var x = 10;
object.getX = function() {
return x;
};
})(foo);
alert(foo.getX()); // 10
立即执行函数与闭包结合使用,匿名函数内部的变量x函数外无法访问,通过函数getx对外暴露出内部变量,这就形成了闭包;
闭包和立即执行和书没有必然联系,只是有时想用到闭包那么可以用(function(){})()来构成闭包,而不是(function(){})()是闭包。
闭包的使用场景
1.利用闭包实现模块化
(function () {
var a = 10;
var b = 20;
function add(num1, num2) {
var num1 = !!num1 ? num1 : a;
var num2 = !!num2 ? num2 : b;
return num1 + num2;
}
window.add = add;
})();
add(10, 20);
2.采用函数引用方式的setTimeOut调用(原生的setTimeout传递的第一个函数不能带参数)
function f1(a) {
function f2() {
console.log(a);
}
return f2;
}
var fun = f1(1);
setTimeout(fun,1000);
网友评论