将一个新函数带入一个闭包

时间:2017-07-27 12:38:14

标签: javascript function scope closures

我已经阅读了很多关于闭包的内容,我经常使用它们但是我发现了一个我不理解的案例。 为什么我的函数不能访问hello变量我正在测试?它不应该通过范围变化找到它吗? 我的代码:

(function($){
    var hello="hello world"
    $.test=function(a){
        alert(hello+" 1")
        a()}
})(this)
test(function(){alert(hello+" 2")})

1 个答案:

答案 0 :(得分:6)

JavaScript使用lexical scope帽子提示去世)。范围取决于函数定义的位置,而不是函数的传递位置或调用位置。

如果您希望函数能够访问传递给它的作用域中的数据中的数据,则需要定义它以使其接受参数,然后您需要传递数据。



"use strict";
(function($) {
  var hello = "hello world"
  $.test = function(a) {
    alert(hello + " 1")
    a(hello);
  }
})(this);
test(function(passed_data) {
  alert(passed_data + " 2")
});




这是一种常见的设计模式。例如,请参见the Promise API

myFirstPromise.then((successMessage) => {
  // successMessage is whatever we passed in the resolve(...) function above.
  // It doesn't have to be a string, but if it is only a succeed message, it probably will be.
  console.log("Yay! " + successMessage);
});

注意传递给then()的函数如何获取一个参数,该参数提供它将要处理的数据。