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

Is it possible in Javascript to create an external closure?

本文关键字:创建 外部 闭包 Javascript 是否      更新时间:2023-09-26

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

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
}

。但后来我发现不可能引用函数的作用域。有没有其他方法可以模拟函数实际范围之外的闭包?

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