假设有A函数和B函数,A潜逃了B函数,也就是B函数载A函数的函数体内,那么载A函数定义的变量,B函数是可以看见的,也就是说B函数是可以引用A函数中定义的变量的。反之,则不行,我们用代码来解释一下
function A() {
var local = "carl";
function B() {
return local;
}
return B();
}
var global = A();
console.log("name=" + global);
想想这段代码会输出什么呢?
答案是:name=carl;
也就是说,这里,b方法引用了a方法中的变量。
我们再来看看另外一个例子:
function A() {
function B() {
var local = "carl";
return local;
}
console.log("local="+local);
return B();
}
var global = A();
console.log("name=" + global);
看看这段代码的执行结果是什么,结果是报错,为什么?因为在A方法里面引用了local这个B方法中的变量,而这个变量是对A不可见的。
实际上为什么会有这么一个结果,他的本质原因在于js里面的作用域链,在js里面,是没有块这个作用域的,取而代之的是函数作用域。a函数的作用域链有两个元素,一个是a本身,一个是全局作用域。在a和全局作用域都没有发现local的定义,所以就会报错。b的作用域链是这样的,它的第一个元素是它本身,第二个是a函数,第三个是全局作用域,所以,第一段代码是可以正常运行的。
最后,再来看看这个问题
function A() {
function B() {
var local = "carl";
return {
getLocal : function() {
return local;
},
setLocal : function(value) {
local = value;
}
}
};
return B();
}
var local = A();
console.log("name=" + local.getLocal());
local.setLocal("wang");
console.log("name=" + local.getLocal());
如果很清楚这个的结果,就基本掌握了什么是js的闭包了。这篇感想,我也是查阅了很多资料,让后把自己想的写出来,如果有什么不对的,希望博友们指出。
上面的结果是
name=carl
name=wang