variables提升

alert(myVar1); return false; var myVar1; 

以上代码在IE,FF和Opera中抛出错误,说明返回语句必须在函数中。 但它在Safari和Chrome中起作用(显示undefined )。

上面的代码已经在全球范围内编写了。 除了所有的function。

任何原因?

在javaScript中,variables被移动到脚本的顶部,然后运行。 所以当你运行它会做

 var myVar1; alert(myVar1); return false; 

这是因为JavaScript没有真正的词汇范围的意义。 这就是为什么它被认为是最好的做法,使所有的variables声明在该地区的顶部,他们将被用来防止起重造成一个问题。 JSLint会呻吟。

这是一个很好的文章,解释它http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Histing

退货是无效的。 如果你想做一个真正的提升的例子(从上面的链接采取)做

 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。 如果您在Chrome中的开发者控制台(ctrl + shift + j)中运行该脚本,它将抛出一个错误,但也运行给你警报。

有时候,起重的解释方式可能会给人以错误的印象,也就是说,JavaScript引擎提升了variables和函数,就好像它们被移动到最顶层一样,这是不正确的,如下面的代码所示:

 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); 

您可能会从variables和函数声明移到顶级语句中获得印象。

但是JavaScript实际上并不是在任何地方移动你的代码 您需要了解JavaScript中的执行上下文。 它有两个阶段创build阶段和执行阶段。 在创build阶段为这些variables和函数创build内存空间,人们似乎混淆了这一步与提升。 JavaScript实际上并没有将你的代码移动到任何地方,JavaScript会为你的所有代码(即variables和函数)创build内存空间,函数可以完全放在内存中,但是在variables的情况下,分配在执行上下文的执行阶段被处理。 所以当你做var a = 'Hello World!' ,JavaScript引擎知道它在执行上下文的执行阶段开始执行时的价值,所以它将占位符置为未定义,并且所有variables最初都被设置为在JavaScript中未定义。 所以依靠吊装看不明确。 所以在代码之上声明variables和函数总是好的。

ECMA-262第3版第12.9节(第75页)指出:

如果ECMAScript程序包含不在FunctionBody内的return语句,则ECMAScript程序在语法上被认为是不正确的。

也就是说,函数之外的return语法错误 。 如果发生语法错误 ,则不运行代码。 想想你的例子,如果你写了:

 alert(myVar1); return false; syntax error)))))))))))))))))); 

另外,第16节(第157页)指出:

一个实现可能会将以下types的运行时错误的任何实例视为语法错误,因此应及早报告:

  • 不正确的使用返回,中断和继续。

Firefox的引擎等。 人。 (即那些允许在全局范围内return JavaScript实现) 可能是一致的,假设以下条款(在同一部分中)允许在全局范围内实现return实现定义:

实施应按规定报告所有错误,但以下情况除外:

  • 一个实现可以提供除本规范中描述的以外的其他types,值,对象,属性和函数。 这可能会导致构造(如在全局范围内查找variables)具有实现定义的行为,而不是引发错误(如ReferenceError )。

这段代码没什么意义:

  • var myVar1将永远不会运行。
  • return false; 因为你不在函数中,所以不会返回任何东西

Opera,IE和FF是错误的,因为这个代码真的是无效的,因为除非你在函数中,否则你不能返回。

如果它在Safari和Chrome中起作用,那么它必须是因为他们使用的JavaScript引擎已经准备好处理错误的代码。 我的猜测是,他们看到“ return ”,并放弃或取代某种break

有关函数的更多信息: http : //www.w3schools.com/js/js_functions.asp

这是JavaScript的悬挂的事情,换句话说,我们正试图打印variables的值,这是没有任何价值

JavaScript将呈现上面的代码为: –

 var myVar1 alert (myVar1) return false