Переменный подъем
alert(myVar1);
return false;
var myVar1;
Выше кода выдает ошибку в IE, FF и Opera, заявляя, что в функцию возвращается функция return. Но он работает (показывает undefined
) в Safari и Chrome.
Вышеприведенный код написан в глобальной области. Вне всех функций.
Любая причина?
Ответы
Ответ 1
В javaScript Переменные перемещаются в начало script, а затем запускаются. Поэтому, когда вы запустите его, он сделает
var myVar1;
alert(myVar1);
return false;
Это потому, что javascript действительно не имеет истинного смысла лексического охвата. Вот почему его рассмотренная наилучшая практика состоит в том, чтобы все ваши переменные были объявлены в верхней части области, и они будут использоваться для предотвращения подъема, вызывающего проблему. JSLint будет стонать об этом.
Это хорошая статья, которая объясняет это http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting
Возврат недействителен. Если вы хотите сделать настоящий пример подъема (взятый из ссылки выше), сделайте
var foo = 1;
function bar() {
if (!foo) {
var foo = 10;
}
alert(foo);
}
bar();
Это будет предупреждать 10
ИЗМЕНИТЬ ПОСЛЕ КОММЕНТАРИИ
Ниже мое понимание, и я прочитал его где-нибудь, но не могу найти все источники, которые я прочитал, поэтому я открыт для исправления.
Это оповещения, благодаря различиям в JavaScript JIT. TraceMonkey (http://ejohn.org/blog/tracemonkey/) Я верю, что вы возьмете JavaScript и сделаете быстрый статический анализ, а затем выполните JIT, а затем попробуйте запустить его. Если это не удается, то, очевидно, ничего не работает.
V8 не выполняет статический анализ и переходит в JIT, а затем запускает что-то. Это больше похоже на python. Если вы запустите script в консоли разработчика (ctrl + shift + j в windows) в Chrome, он выкинет ошибку, но также запустится, чтобы дать вам предупреждение.
Ответ 2
Иногда подъемный процесс объясняется способом, который может дать неправильное впечатление, то есть переменные и функции поднимаются движком JavaScript, как если бы они были физически перемещены сверху, что на самом деле не так, как показано в приведенном ниже коде:
console.log(a);
var a = 'Hello World!';
То, что мы видим на консоли, это undefined
, а не 'Hello World'
, поэтому мы получили поведение следующего кода
var a;
console.log(a);
a = 'Hello World!';
не поведение
var a = 'Hello World!';
console.log(a);
который вы можете получить от объявления переменных и функций, перемещаемых в верхний оператор.
Но JavaScript на самом деле не перемещает ваш код нигде. Вам нужно понять контекст исполнения в JavaScript. Он имеет фазу создания фазы и фазы выполнения. В фазе создания создается пространство памяти для этих переменных и функций, и люди, похоже, путают этот шаг с подъемом. JavaScript на самом деле не перемещает ваш код в любом месте, что происходит, так как JavaScript создал пространство памяти для всего вашего кода, то есть переменные и функции, функции могут быть размещены полностью в памяти, но в случае переменных назначения обрабатываются на этапе выполнения контекста выполнения. Поэтому, когда вы выполняете var a = 'Hello World!'
, JavaScript-движок знает значение a
, когда он начинает выполнять его в стадии выполнения контекста выполнения, поэтому он помещает placeholder undefined, и все переменные изначально устанавливаются на undefined в JavaScript. Поэтому неплохо полагаться на подъем и видеть undefined. Поэтому всегда полезно объявлять переменные и функции поверх вашего кода.
Ответ 3
В разделе 12.9 (стр. 75) издания ECMA-262 3 говорится:
Программа ECMAScript считается синтаксически неправильной, если она содержит оператор return
, который не находится в функциональном блоке.
То есть, return
вне функции является синтаксической ошибкой. Если возникает синтаксическая ошибка, код не запускается. Подумайте о своем примере, как будто вы написали:
alert(myVar1);
return false;
syntax error))))))))))))))))));
Кроме того, в разделе 16 (стр. 157) указано:
Реализация может рассматривать любой экземпляр следующих типов ошибок времени выполнения как синтаксическую ошибку и, следовательно, сообщите об этом на ранней стадии:
- Неправильное использование return, break и continue.
Firefox engine et. и др. (т.е. те реализации JavaScript, которые позволяют return
в глобальной области), могут соответствовать друг другу, предполагая, что следующее предложение (в том же разделе) допускает определение реализации return
в глобальной области:
Реализация должна сообщать обо всех ошибках, как указано, за исключением следующего:
- Реализация может предоставлять дополнительные типы, значения, объекты, свойства и функции, помимо тех, которые описаны в этой спецификации. Это может привести к конструкциям (например, поиск переменной в глобальной области), чтобы иметь поведение, определяемое реализацией, вместо того, чтобы бросать ошибку (например, ReferenceError).
Ответ 4
Этот код не имеет смысла:
-
var myVar1
никогда не будет запущен.
-
return false;
не вернет вещь, так как вы не в функции
Opera, IE и FF имеют право выбросить ошибку, потому что этот код действительно недействителен, так как вы не можете вернуться, если не находитесь в функции.
Если он работает в Safari и Chrome, это должно быть из-за того, что используемый ими механизм javascript готов к работе с багги-кодом. Я предполагаю, что они видят "return
" и отбрасывают или заменяют его каким-то break
.
Дополнительная информация о функциях: http://www.w3schools.com/js/js_functions.asp
Ответ 5
Это JavaScript Подъемная вещь. Другими словами, мы пытаемся напечатать значение переменной, которая не имеет никакого значения
Javascript отобразит указанный выше код как: -
var myVar1
alert (myVar1)
return false