Переменный подъем

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