【问题标题】:Is it possible in Javascript to create an external closure?是否可以在 Javascript 中创建外部闭包?
【发布时间】:2016-06-04 10:38:22
【问题描述】:

通常,要创建一个闭包,你会在另一个函数中创建它,它会获取其父函数的作用域:

var parent = function(){
  var a = "works!";
  var subfunction(){
    console.log(a); // "works!"
  }
  subfunction();
}

我正在尝试找出一种方法来模拟这种闭包行为,该函数在父函数外部 中定义。我知道这可以使用参数:

var parent = function(){
  var a = "hello";
  subfunction(a);
}
var subfunction(a){
  console.log(a); // works, but because it's a param
}

我试图弄清楚是否有一种方法可以做到这一点,而不必显式设置所有参数。我最初认为我可以将函数本地范围对象作为参数传递

var parent = function(){
  var a = "hello";
  subfunction(localScope);
}
var subfunction(localScope){
  console.log(localScope.a); // not going to work this way
}

...但我后来发现it's impossible to get a reference to a function's scope。是否有其他方法可以模拟函数实际范围之外的闭包?

【问题讨论】:

标签: javascript scope closures


【解决方案1】:

不,JS 中的闭包总是词法的(即引用它们的父作用域)。

如果你想创建一个具有显式设置环境的闭包,你当然可以为此使用辅助函数:

function unrelated() {
    var closure = makeClosure("hello");
    closure();
}
unrelated();

function makeClosure(a) {
    return function() { // closes only over `a` and nothing else
        console.log(a);
    }
}

这与您将获得“外部关闭”一样接近。请注意,您只能将值传递给makeClosure,而不是对局部变量的引用。当然,您可以创建对象并将引用传递给它们,并且使用with(不推荐!)您甚至可以使它们看起来像变量。

【讨论】:

  • 这似乎与我的第二个示例几乎完全相同,除了不是将 a 作为参数传递,而是将 a 作为参数传递参数。
  • @brentonsrine:不同之处(使它更接近原始闭包)是我在 创建 函数时传递值,而不是在 调用 它。
  • 这太糟糕了,它是如何获得支持的超出了我的范围。是的,Bergi,这与他的第二个例子不同,但这不是他所要求的,甚至不是遥不可及
  • @QBM5:不确定这个解决方案有多糟糕?虽然我不确定他在问什么或为什么(以及他有什么问题),但我认为我的第一句话确实回答了这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多