关于js闭包自己的理解
2015-05-26 12:02
302 查看
假设有A函数和B函数,A潜逃了B函数,也就是B函数载A函数的函数体内,那么载A函数定义的变量,B函数是可以看见的,也就是说B函数是可以引用A函数中定义的变量的。反之,则不行,我们用代码来解释一下
想想这段代码会输出什么呢?
答案是:name=carl;
也就是说,这里,b方法引用了a方法中的变量。
我们再来看看另外一个例子:
看看这段代码的执行结果是什么,结果是报错,为什么?因为在A方法里面引用了local这个B方法中的变量,而这个变量是对A不可见的。
实际上为什么会有这么一个结果,他的本质原因在于js里面的作用域链,在js里面,是没有块这个作用域的,取而代之的是函数作用域。a函数的作用域链有两个元素,一个是a本身,一个是全局作用域。在a和全局作用域都没有发现local的定义,所以就会报错。b的作用域链是这样的,它的第一个元素是它本身,第二个是a函数,第三个是全局作用域,所以,第一段代码是可以正常运行的。
最后,再来看看这个问题
如果很清楚这个的结果,就基本掌握了什么是js的闭包了。这篇感想,我也是查阅了很多资料,让后把自己想的写出来,如果有什么不对的,希望博友们指出。
上面的结果是
name=carl
name=wang
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
相关文章推荐
- JS:关于我对闭包的理解
- 关于js 闭包的理解及特点
- 关于js闭包的一些理解
- 【闭包概念】关于闭包概念各路神仙的不同解读——你可以自己理解。
- 关于JS闭包的理解
- JS 关于原型和闭包的理解
- 谈谈自己对js闭包,执行上下文,作用域链,活动对象AO,变量对象VO的理解
- 关于闭包的理解(JS学习小结)
- 关于 js 的 prototype , call,apply ,闭包,回调 个人浅显理解
- 关于js闭包的研究和理解
- 关于js闭包的理解
- 关于JS闭包的理解
- 关于js 的闭包
- 关于js中function(e) e的理解
- js 闭包之我理解
- 对js闭包的理解
- JS中的闭包简单理解
- javascript深入理解js闭包
- 关于js闭包的误区
- 两道关于JS的小考题(闭包与中间件)