2013-10-10 5 views
1

Broken ScopeКакова область действия Javascript/JQuery?

Может ли кто-нибудь объяснить мне, как это порождает предупреждения.

Следует отметить, что перед запросом переменная $ me не определена вне вызова функции. Разумеется, объем $ me должен заканчиваться в конце инструкции if.

Я чувствую, что у меня нет ничего очевидного здесь, но я не могу его перенести.

+3

Области только в пределах функций. '$ me' не исчезает только потому, что вы выходите из запроса' if' (если да, то что, черт возьми, вы делаете с вашим кодом ?!). Просто объявляйте 'var $ me' снаружи. – h2ooooooo

+1

http://diablo.incgamers.com/gallery/data/500/cannot-be-unseen.jpg – jAndy

+1

В блоках javascript не создается область действия. Объявляете ли вы переменную в цикле for-loop, if-statement или while/do while, эта переменная будет существовать вне этого блока. –

ответ

5

В переменных JavaScript не ограничивается объем блока.

var foo = "a"; 
if (true) { 
    var foo = "b"; 
} 
console.log(foo); // "b" not "a" 

Объявления переменных получить водрузили (переехал в верхней части), так что на самом деле это говорит:

var foo; 
var foo; 
foo = "a" 
if (true) { 
    foo = "b"; 
} 
console.log(foo); // "b" 

Переменные всегда получают водрузили на вершине сферы. В общем случае функции имеют только функции. if не создает свой собственный объем. Также нет for, while или даже switch.

Это простой, чтобы сделать эту ошибку (даже для ветеранов-программистов), чтобы JSHint дал вам знать об этом.

+1

Thumbs up для упоминания о подъеме –

+0

используйте 'if (false)', чтобы сделать его более впечатляющим – jAndy

+1

@jAndy, который на самом деле не работает.Просто объявление появляется, а не определение;) - Важно понимать, что 'var foo =" bar "' является объявлением _and_ определением, и они являются двумя _секретными вещами. – Halcyon

4

if заявления не имеют собственного объема. Это все еще область, в которой они использовались, например. функции или глобальной области.

Из-за этого переменные, определенные в if, будут сталкиваться с предыдущими определенными переменными.

+0

Объявления переменных * будут * сталкиваться из-за подъема, независимо от того, будет ли достигнута эта часть кода. – JJJ

+0

@Juhana Так же, как вы можете прочитать в моем ответе;) –

+0

«can collide» - это не то же самое, что «столкнется». – JJJ

1

Функция неоднократно пытается объявить var $me, когда она должна быть объявлена ​​только один раз.

//Scope is defined at function level 
function something(){ 
    var $me = {}; //declaration, only do this once within a function 
    if(something){ 
     $me = "x"; //assignment, for after a var is declared 
    }else if(somethingElse){ 
     $me = "y"; //another assignment, do this as much as you want 
    } 
} 
Смежные вопросы