防止 JavaScript 闭包继承作用域
Prevent JavaScript closure from inheriting scope
我正在寻找一种奇特的方法来防止闭包继承周围的范围。例如:
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;
};
您可以使用块作用域
let foo = function(t) {
{
// `x` is only defined as `"y"` here
let x = "y";
}
{
t.bar = function(x) {
console.log(x); // `undefined` or `x` passed as parameter
};
}
};
const o = {};
foo(o);
o.bar();
此技术有效:
const foo = 3;
it.cb(isolated(h => {
console.log(foo); // this will throw "ReferenceError: foo is not defined"
h.ctn();
}));
您可能还会遇到 JavaScript with
运算符
我正在寻找一种奇特的方法来防止闭包继承周围的范围。例如:
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;
};
您可以使用块作用域
let foo = function(t) {
{
// `x` is only defined as `"y"` here
let x = "y";
}
{
t.bar = function(x) {
console.log(x); // `undefined` or `x` passed as parameter
};
}
};
const o = {};
foo(o);
o.bar();
此技术有效:
const foo = 3;
it.cb(isolated(h => {
console.log(foo); // this will throw "ReferenceError: foo is not defined"
h.ctn();
}));
您可能还会遇到 JavaScript with
运算符