2015-07-12 7 views
9

Для лучшего знания того, что использует функция, и т. Д. Может ли быть быстрее для поиска переменных, если вы не получаете доступ к глобальной области?Возможно ли написать функцию JS без доступа к глобальным переменным?

Предположим, у меня есть:

a = 5; 
b = 5; 

в глобальном масштабе. Можно обернуть функцию ниже таким образом, что

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

не будет иметь доступ к «а» и глобальное пространство имен и вернуть

Uncaught ReferenceError: a is not defined 
+0

Да, * конечно * возможно. Фактически, большинство функций идеально * не должны * обращаться к глобальным переменным. В чем тут вопрос? –

+0

@AlexisKing: Я думаю, что вопрос заключается в том, можно ли запустить какой-то код в контексте, где он не просто * не *, а * не может * обращаться к глобальным переменным. – icktoofay

+0

@icktoofay А, да, это имеет немного больше смысла. Извините за мое недоразумение. –

ответ

2

Нет, нет никакого способа, чтобы полностью предотвратить доступ к глобальной переменные. Тем не менее, вы можете предоставить разные набор глобальных переменных: а именно, запустите его в iframe. Это не является пуленепробиваемым, хотя, поскольку он мог бы просто использовать window.parent для доступа к глобальным переменным родителя.

1

Да. Ниже приведен пример с 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 
})() 
0

Я считаю, что независимо от того, что текущая область является, всегда есть способ добраться до глобального объекта:

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

Тогда можно получить доступ к любому свойству глобального объекта непосредственно:

let value = ref_to_global["a"]; 

Это означает, что нет никакого способа, чтобы сделать глобальный охват недоступным, если это был вопрос.

Смежные вопросы