【发布时间】:2017-12-28 20:12:59
【问题描述】:
我正在寻找一种奇特的方法来防止闭包继承周围的 scrope。例如:
let foo = function(t){
let x = 'y';
t.bar = function(){
console.log(x); // => 'y'
});
};
只有两种方法我知道防止共享范围:
(1) 使用阴影变量:
let foo = function(t){
let x = 'y';
t.bar = function(x){
console.log(x); // => '?'
});
};
(2) 把函数体放到别的地方:
let foo = function(t){
let x = 'y';
t.bar = createBar();
};
我的问题是——有谁知道防止闭包在 JS 中继承作用域的第三种方法?花哨的东西很好。
我认为唯一可行的是 Node.js 中的 vm.runInThisContext()。
让我们想象一下,假设 JS 有一个 private 关键字,这意味着该变量仅对该函数的范围是私有的,如下所示:
let foo = function(t){
private let x = 'y'; // "private" means inaccessible to enclosed functions
t.bar = function(){
console.log(x); // => undefined
});
};
并且 IIFE 不起作用:
let foo = function(t){
(function() {
let x = 'y';
}());
console.log(x); // undefined (or error will be thrown)
// I want x defined here
t.bar = function(){
// but I do not want x defined here
console.log(x);
}
return t;
};
【问题讨论】:
-
“私有”变量或在较低范围内无法访问的变量等通常没有太多用处,这就是为什么实际上没有任何方法可以创建此类变量的原因。如果您希望某些内容无法访问,请将其包含在它自己的范围内,例如 IIFE 等。
-
也许你想要一个 IIFE?
-
您可以将我的 1000 美元转入我在开曼群岛的账户 -> jsfiddle.net/01fyqp0v
-
知道了,块范围似乎是这样!
-
@AlexanderMills 我不知道...我认为 OP 有点像 IIFE。
标签: javascript node.js closures lexical-closures