关于作用域链与闭包的笔记

  先抛个我所了解到的作用域链的概念:每一个函数可以看作是一个执行环境,每一个执行环境都会存在有一个关联的变量对象,而这个对象保存着这个环境中定义的变量和函数。函数外部的一个个执行环境的即关联着一个个变量对象,而这些变量对象即组成了一条链,称之为作用域链。

闭包,晦涩难懂,这是最直观的感受,第一次接触闭包是在毕向东的视频里的。当时觉得有点奇怪,这不是很正常的事情么,返回一个值,为什么还要单独拿出来说,所以就直接跳过了。但是当看到很多面试题询问到关于闭包的这个含义,特别是看到一个同学去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/,感兴趣的可以去翻翻,比我的写得好多了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值