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

时间:2016-02-22 20:29:47

标签: 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
}

我试图弄清楚是否有办法做到这一点,而无需明确设置所有参数。我最初认为我能够将函数local scope object作为参数传递

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

1 个答案:

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