hhking / hhking.github.io

博客
https://blog.hhking.cn/
3 stars 0 forks source link

[译] 我从没理解过 JavaScript 闭包 | HK Talk #28

Open hhking opened 5 years ago

hhking commented 5 years ago

https://blog.hhking.cn/2018/09/08/i-never-understood-javascript-closures/

原文: I never understood JavaScript closures作者: Olivier De Meulder时间: Sep 7, 2017译注:作者从 JavaScript 的原理出发,详细解读执行过程,通过“背包”的形象比喻,来解释闭包。 我从没理解过 JavaScript 闭包直到有人这样跟我解释…… 正如标题所说,JavaScript 闭包对我来说一直是个迷。我 看

cheniot commented 5 years ago

很棒

wj3206069 commented 5 years ago

简单点来说,当一个局部函数访问了外部函数的变量就会产生一个闭包,闭包是为了解决局部变量的生成周期的问题

azl397985856 commented 5 years ago

之前看过英文原版的, 竟然看到了中文版的,辛苦辛苦,可以转发给需要的人了 😄

hhking commented 5 years ago

@azl397985856 之前看过英文原版的, 竟然看到了中文版的,辛苦辛苦,可以转发给需要的人了 😄

谢谢支持!

WilliamHuge commented 5 years ago

写的太好了,楼主搬运幸苦了,希望能看到更多好文,赞一个

Aloehuang commented 4 years ago

词法作用域这个地方有点疑问,执行下面的代码:

let a = 0;
function addone() {
    let a = 10;
    addtwo();
}

function addtwo() {
    let a = 20;
    addthree();
}
function addthree() {
    console.log(a);
}

addone();

结果为0,为什么不是20呢?不是说一层一层从调用上下文查找直到全局上下文吗?

hhking commented 4 years ago

@Aloehuang 词法作用域这个地方有点疑问,执行下面的代码:

let a = 0; function addone() { let a = 10; addtwo(); }

function addtwo() { let a = 20; addthree(); } function addthree() { console.log(a); }

addone(); 结果为0,为什么不是20呢?不是说一层一层从调用上下文查找直到全局上下文吗?

词法作用域,也就是静态作用域,所以函数的作用域是在定义的时候确定的,而不是执行的时候。