爲了更好地瞭解函數正在使用的內容等。 如果不訪問全局範圍,變量查找可能會更快嗎?是否可以編寫一個JS函數而不訪問全局變量?
假設我有:
a = 5;
b = 5;
在全球範圍內
。是否有可能換下面的功能,使得
function go() {
console.log(a);
}
將無法訪問「a」和全局命名空間,並返回
Uncaught ReferenceError: a is not defined
爲了更好地瞭解函數正在使用的內容等。 如果不訪問全局範圍,變量查找可能會更快嗎?是否可以編寫一個JS函數而不訪問全局變量?
假設我有:
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"];
這意味着沒有辦法使全球範圍內人跡罕至,如果這是一個問題。
是的,*當然*這是可能的。事實上,大多數函數理想地*不應該訪問全局變量。這裏有什麼問題? –
@AlexisKing:我認爲問題在於是否可以在不僅*不*但不*訪問全局變量的上下文中運行某些代碼。 – icktoofay
@icktoofay啊,是的,這樣做更有意義。對不起,我的誤解。 –