先抛个我所了解到的作用域链的概念:每一个函数可以看作是一个执行环境,每一个执行环境都会存在有一个关联的变量对象,而这个对象保存着这个环境中定义的变量和函数。函数外部的一个个执行环境的即关联着一个个变量对象,而这些变量对象即组成了一条链,称之为作用域链。
闭包,晦涩难懂,这是最直观的感受,第一次接触闭包是在毕向东的视频里的。当时觉得有点奇怪,这不是很正常的事情么,返回一个值,为什么还要单独拿出来说,所以就直接跳过了。但是当看到很多面试题询问到关于闭包的这个含义,特别是看到一个同学去tx面试被问到关于闭包的概念,我觉得还是要回去看一下。于是我翻开了那本厚厚的犀牛书。总结如下:若A函数把其中的一个嵌套函数B返回出去,那么,即使A函数执行完毕,其中的作用域链也不会被垃圾机制回收,即这一个个变量对象依然存在于内存当中。
var a = 1;
function b(){
var a =2;
c();
}
function c(){
console.log(a);
}
b(); // a = 1; 哪个对象能调用到c函数,也就只有全局对象,所以是1.
c(); // a = 1;
---------------分割线-------------------------------
这是朋友给的一道题
var a = 1;
function foo(){
console.log(a);
a = 2;
console.log(this.a);
var b = 3;
console.log(b);
var a;
console.log(a);
}
foo();
当时看到这个很自然地说出了1,2,3,undefined怎么可以这么无脑
其实应该是undefined,1,3,2.
以上代码可等价于:
var a = 1;
function foo(){
var a,b;
console.log(a);
a = 2;
console.log(window.a);
b = 3;
console.log(b);
console.log(a);
}
window.foo();
this.a,只有window对象在调用foo(),于是this也就是指window对象了,于是window对象的作用域链之内能找到的a也就是1了。
这是朋友的博客的链接http://bless-l.github.io/,感兴趣的可以去翻翻,比我的写得好多了。