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