簡體   English   中英

是否有可能編寫一個無法訪問全局變量的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”和全局命名空間並返回

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"];

這意味着如果這是一個問題,就無法使全局范圍無法訪問。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM