Javascript:嵌套函数如何从父函数中获取变量

时间:2014-12-10 07:51:32

标签: javascript

我已经阅读了有关js闭包的所有内容,但无法理解以下代码:

function main(condition){
  var a;
  if (condition){
    a="aaa";
  }
  else 
  {
    a="bbb";
    return;
  }
  button.addEventListener("click", function(){ alert(a);});
}
main(true);
main(false);

之后点击按钮。结果是:" aaa"。 Doest这意味着嵌套函数不保留对变量的引用而是复制它们吗?请解释一下。

4 个答案:

答案 0 :(得分:2)

第一次运行main时,将"aaa"分配给a(这是一个局部变量),然后绑定一个读取该变量的事件处理程序。

第二次运行main时,您将"bbb"分配给a(因为这是函数的另一个调用,它是不同的局部变量)。您绑定事件处理程序,该事件处理程序首先从return读取该变量。

当点击事件触发时,它运行的函数在第一次调用的a范围内,而不是第二次调用,因此值为"aaa"

答案 1 :(得分:0)

我想说这就是关闭的全部内容。关闭是"内部功能"保留对有效"有效"的变量值的访问权限。在内部功能即使在"外部功能"之后创建的那一刻返回。

考虑以下示例:

var outerFunc = function(a) {
  return function (x) {
    return x+a;
  }
} //the outer function returns a function

现在让我们调用外部函数并将返回的值存储在变量newFunc中:

var newFunc = outerFunc(15); //the outer function has been invoked, newFunc is a function

newFunc(1); //let's invoke the resulting "inner function"

结果将是16.内部函数将始终记住值15,即使您使用其他参数值调用外部函数也是如此。这就是JavaScript的工作原理。

在您的示例中,事件监听器发生了非常类似的事情。内部功能(带警报)被注册为对点击事件的反应,它始终记住' a的价值。当你按下按钮时,这会调用这个“内心”按钮。功能

答案 2 :(得分:0)

要获得您可能需要的行为,请尝试:

var main = function () {
    var a;
    return function() {
        if (condition){
            a="aaa";
        }
        else 
        {
            a="bbb";
            return;
        }
        button.addEventListener("click", function(){ alert(a);});
    };
}();

main(true);
main(false);

这是有效的,因为它以一种在函数调用中持续存在的方式定义a,正如另一个回答者所指出的那样,这是问题所在。

答案 3 :(得分:-1)

这不是一个闭包,它只是对一个函数的双重调用,当它为true时它会添加事件监听器以便它打印'aaa'但第二次没有添加一个事件,因为它在添加它之前返回