# Version A - Function Declaration Statement
// Some JavaScript code
function a() {
// code within function
}
//Some more JavaScript code
# Version B - Function Expression
// Some JavaScript code
var b = function () {
// code within function
};
// Some more JavaScript code
我一直在阅读JavaScript:The Definitive Guide,我想确保我理解这两个版本是如何被JavaScript处理的。我将解释我对以下每个版本的理解:
版本A
版本B
与上面的步骤1相同 - JavaScript在全局范围内扫描脚本并识别所有变量和函数定义并将它们提升到顶部。因为变量b被提升到顶部,所以脚本等同于:
var b;
// Some JavaScript code
b = function (){ /* code within function */ };
// Some more JavaScript code
当JavaScript进入变量b的赋值时,它会看到正在定义一个匿名函数对象。当JavaScript定义函数时,它将打包定义函数的上下文(在本例中,它是全局上下文)并将其与函数的作用域链相关联。此时,匿名函数将知道步骤1中的所有变量和函数定义,其中包括var b未定义。
如果您可以对每个版本发表评论并让我知道我的理解是否准确,那就太棒了。
答案 0 :(得分:0)
理论很好,但在现实生活中,浏览器使用自己的方言(因为使用自己的引擎并添加了浏览器糖果)。
例如,IE并不关心您的脚本标记是否指定了#text / javascript'。它无论如何都会使用自己的JScript。
所以(设计一个多语言EcmaScript方言)有助于理解这个理论在现实生活中可能不会以同样的方式发挥作用。
例如,命名函数表达式被视为BOTH - IE中的函数声明AND函数表达式(JScript):
typeof g; // "function"
var f = function g(){};
请参阅此链接以了解其中一些示例:
http://kangax.github.com/nfe/#jscript-bugs
实际上,这是一个相当完整的“半官方”官员。 (来自MS的Pratap Lakshman)关于J4偏离ES3的概述:
http://wiki.ecmascript.org/lib/exe/fetch.php?media=resources:jscriptdeviationsfromes3.pdf
最后,我想指出这个非常有用的视频,其中道格拉斯·克罗克福德在“克拉克福德的JavaScript”中解释了一些更彻底的内容 - 第三幕:功能终极':
http://youtu.be/ya4UHuXNygM
希望这有帮助!