为什么闭包允许函数在定义函数时访问范围内的外部变量?

时间:2017-02-09 20:27:06

标签: javascript

一个开发人员问他在某个地方听到的问题,他说:

  

闭包允许函数

     
      
  1. 在定义函数时访问范围内的外部变量
  2.   
  3. 在调用函数时访问范围内的外部变量
  4.   

答案是定义函数的时候。我想绕过我的脑袋:

  1. 为什么这很重要。
  2. 你怎么知道或测试这个。
  3. 我的问题是:如果只能在调用闭包时控制日志,那么在定义时闭包是否可以访问作用域中的外部变量?我想看一些证明这一点的代码。

    第二个问题是:如果闭包可以访问范围内的外部变量,那么这会给你带来什么好处以及它为何重要?

1 个答案:

答案 0 :(得分:2)

function makeCallback() {
    var foo = 'one';

    return function () {
        alert(foo);
    };
}

function bar(callback) {
    var foo = 'two';
    callback();
}

bar(makeCallback());

这个是差异的重点。如果该函数可以从它调用的范围中访问变量,则会警告"两个"。这称为dynamic scoping。但是由于Javascript使用词法范围,它实际上会警告"一个"。