javascript - 是否可以在 Javascript 中创建外部闭包?

标签 javascript scope closures

通常,要创建一个闭包,您可以在另一个函数中创建它,并获得其父级的作用域:

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 .有没有其他方法可以在函数的实际范围之外模拟闭包?

最佳答案

不,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 (不推荐!)您甚至可以让它们看起来像变量。

关于javascript - 是否可以在 Javascript 中创建外部闭包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35563195/

相关文章:

javascript - 在循环中附加事件 (IE 7)

ios - Swift 闭包内存使用

javascript - jQuery:鼠标悬停在背景 div "through"上是前景工具提示吗?

c# - C# 中的变量范围混淆

java - 使用请求参数从 JavaScript 调用 servlet

c++ - 为什么不能在 C++ 类中重新定义类型名称?

javascript - 函数未在 onclick 事件中调用

python - 使用闭包实现 python 生成器

javascript - Angular JS Controller 内函数的作用域

javascript - jQuery 未显示警告消息