您的位置:首页 > Web前端 > JavaScript

关于js闭包自己的理解

2015-05-26 12:02 302 查看
假设有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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: