通常,要创建一个闭包,可以在另一个函数中创建它,并获取其父级的范围:
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之后。是否有其他方法可以在函数的实际范围之外模拟闭包?
答案 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
(不推荐!),你甚至可以使它们看起来像变量。