2015-07-12 3 views
9

Um besser zu wissen, was eine Funktion verwendet, usw. Ist die Suche nach Variablen möglicherweise auch schneller, wenn nicht auf den globalen Bereich zugegriffen wird?Ist es möglich, eine JS-Funktion ohne Zugriff auf globale Variablen zu schreiben?

Angenommen, ich habe:

a = 5; 
b = 5; 

im globalen Bereich. Ist es möglich, wickelt die Funktion unten, so dass

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

würde keinen Zugang zu „a“ und dem globalen Namespace und das Rück

Uncaught ReferenceError: a is not defined 
+0

Ja, * natürlich * ist möglich. Tatsächlich sollten die meisten Funktionen idealerweise * nicht auf globale Variablen zugreifen. Was ist die Frage hier? –

+0

@AlexisKing: Ich denke, die Frage ist, ob es möglich ist, etwas Code in einem Kontext auszuführen, in dem es nicht nur * nicht *, sondern * nicht * auf globale Variablen zugreifen kann. – icktoofay

+0

@icktoofay Ah, ja, das macht ein bisschen mehr Sinn. Entschuldigung für mein Missverständnis. –

Antwort

2

Nein, es gibt keinen Weg, um vollständig den Zugang zu globalen zu verhindern Variablen. Das heißt, Sie können bieten Sie eine anderen Satz von globalen Variablen: nämlich, führen Sie es in einem iframe. Dies ist jedoch nicht kugelsicher, da dann einfach window.parent verwendet werden kann, um auf die globalen Variablen des übergeordneten Elements zuzugreifen.

1

Ja. Das Beispiel unten ist direkt von MDN eval.

Sie könnten dies versuchen IF Sie könnten Ihre gesamte Codebasis in einer einzigen Wrapper-Funktion, so dass alle Ihre Objekte und Funktionen in den lokalen Bereich fallen. (Ich bin nicht sicher, wie praktikabel das ist, aber es funktioniert in Chrome und 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 
})() 
0

Ich glaube, dass, egal was der aktuelle Bereich ist, gibt es immer eine Möglichkeit, um das globale Objekt zu erhalten:

let ref_to_global = (function(){ 
    return this; 
}).call(null); 

Dann kann man jede Eigenschaft des globalen Objekts direkt zugreifen:

let value = ref_to_global["a"]; 

das heißt, es gibt keine Möglichkeit, globale Reichweite unzugänglich zu machen, ob das eine Frage war.

Verwandte Themen