是否可以编写无法访问全局变量的 JS 函数?
Is it possible to write a JS function with no access to global variables?
为了更好地了解函数的用途等。
如果不访问全局范围,变量查找也可能更快?
假设我有:
a = 5;
b = 5;
在全球范围内。是否可以将下面的函数包装成
function go() {
console.log(a);
}
将无法访问 "a" 和全局命名空间以及 return
Uncaught ReferenceError: a is not defined
不,没有办法完全阻止对全局变量的访问。也就是说,您 可以 为它提供一组 不同的 全局变量:即 运行 它在 iframe
中。不过,这不是万无一失的,因为它可以只使用 window.parent
来访问父级的全局变量。
是的。下面的示例直接来自 MDN eval。
您可以试试这个 IF 您可以将整个代码库包装在一个包装函数中,以便所有对象和函数都属于本地范围。 (我不确定这是否可行,但它适用于 Chrome 和 Firefox)
(function() {
var x = 2, y = 4;
function range(a,b){return [a,b];}
console.log("DIRECT", eval("x + y"), eval("range(3,4)")); // Direct call, uses local scope, result is 6
var geval = eval;
console.log("INDIRECT", geval("x + y"), geval("range(3,4)")); // Indirect call, uses global scope, throws ReferenceError because `x` is undefined
})()
我相信无论当前范围是什么,总有办法到达全局对象:
let ref_to_global = (function(){
return this;
}).call(null);
然后就可以直接访问全局对象的任何属性:
let value = ref_to_global["a"];
这意味着没有办法使全局范围不可访问,如果这是一个问题。
为了更好地了解函数的用途等。 如果不访问全局范围,变量查找也可能更快?
假设我有:
a = 5;
b = 5;
在全球范围内。是否可以将下面的函数包装成
function go() {
console.log(a);
}
将无法访问 "a" 和全局命名空间以及 return
Uncaught ReferenceError: a is not defined
不,没有办法完全阻止对全局变量的访问。也就是说,您 可以 为它提供一组 不同的 全局变量:即 运行 它在 iframe
中。不过,这不是万无一失的,因为它可以只使用 window.parent
来访问父级的全局变量。
是的。下面的示例直接来自 MDN eval。
您可以试试这个 IF 您可以将整个代码库包装在一个包装函数中,以便所有对象和函数都属于本地范围。 (我不确定这是否可行,但它适用于 Chrome 和 Firefox)
(function() {
var x = 2, y = 4;
function range(a,b){return [a,b];}
console.log("DIRECT", eval("x + y"), eval("range(3,4)")); // Direct call, uses local scope, result is 6
var geval = eval;
console.log("INDIRECT", geval("x + y"), geval("range(3,4)")); // Indirect call, uses global scope, throws ReferenceError because `x` is undefined
})()
我相信无论当前范围是什么,总有办法到达全局对象:
let ref_to_global = (function(){
return this;
}).call(null);
然后就可以直接访问全局对象的任何属性:
let value = ref_to_global["a"];
这意味着没有办法使全局范围不可访问,如果这是一个问题。