Javascript:不同形式的功能之间的差异

时间:2013-03-27 17:34:26

标签: javascript function

# 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

  1. JavaScript扫描全局范围内的脚本,并识别所有变量和函数定义,并将它们提升到顶部。变量赋值和函数评估尚未发生。
  2. 对于函数a(),JavaScript将打包全局上下文并将其与函数的作用域链相关联。此时,函数a()将知道步骤1中的所有变量和函数定义。
  3. JavaScript不会评估函数a(),因此不了解函数中的本地上下文。在调用该函数之前,这将保持为真。
  4. 版本B

    1. 与上面的步骤1相同 - JavaScript在全局范围内扫描脚本并识别所有变量和函数定义并将它们提升到顶部。因为变量b被提升到顶部,所以脚本等同于:

      var b;
      // Some JavaScript code
      b = function (){ /* code within function */ };
      // Some more JavaScript code
      
    2. 当JavaScript进入变量b的赋值时,它会看到正在定义一个匿名函数对象。当JavaScript定义函数时,它将打包定义函数的上下文(在本例中,它是全局上下文)并将其与函数的作用域链相关联。此时,匿名函数将知道步骤1中的所有变量和函数定义,其中包括var b未定义。

    3. 因为JavaScript看到函数被用作变量赋值中的表达式,所以它将评估函数表达式。当它评估函数表达式时,它将再次将本地作用域内的所有变量和函数定义提升到顶部,如果此函数表达式中有任何函数声明语句,它将打包此本地上下文并将其添加到作用域链中这个功能。
    4. 在评估函数时返回函数对象,然后将函数对象分配给var b。
    5. 如果您可以对每个版本发表评论并让我知道我的理解是否准确,那就太棒了。

1 个答案:

答案 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

希望这有帮助!