是否有可能编写一个无法访问全局变量的JS函数?

Is it possible to write a JS function with no access to global variables?

本文关键字:全局变量 访问 JS 函数 一个 有可能 是否      更新时间:2023-09-26

以便更好地了解函数正在使用的内容等。如果不访问全局作用域,变量查找可能也会更快?

假设我有:

a = 5;
b = 5;

在全局作用域中。是否有可能将函数包装在

下面
function go() {
   console.log(a);
}

将无法访问"a"和全局命名空间并返回

Uncaught ReferenceError: a is not defined

不,没有办法完全阻止对全局变量的访问。也就是说,您可以为它提供一组不同的全局变量:也就是说,在iframe中运行它。但是,这并不是万无一失的,因为它可以使用window.parent来访问父类的全局变量。

是。下面的例子直接来自MDN eval。

你可以试试这个如果你可以把你的整个代码库包装在一个包装器函数中,这样你所有的对象和函数都属于局部作用域。(我不确定这是可行的,但它在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"];

这意味着没有办法使全局作用域不可访问,如果这是一个问题。