首页 文章

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

提问于
浏览
2
# 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处理的 . 我将解释我对以下每个版本的理解:

Version A

  • JavaScript在全局范围内扫描脚本,并识别所有变量和函数定义,并将它们提升到顶部 . 变量赋值和函数评估尚未发生 .

  • 对于函数a(),JavaScript将打包全局上下文并将其与函数的作用域链相关联 . 此时,函数a()将知道步骤1中的所有变量和函数定义 .

  • JavaScript不评估函数a(),因此不了解函数中的本地上下文 . 在调用函数之前,这将保持为真 .

Version B

  • 与上面的步骤1相同 - JavaScript在全局范围内扫描脚本并识别所有变量和函数定义并将它们提升到顶部 . 因为变量b被提升到顶部,所以脚本等同于:
var b;
// Some JavaScript code
b = function (){ /* code within function */ };
// Some more JavaScript code
  • 当JavaScript进入变量b的赋值时,它会看到正在定义一个匿名函数对象 . 当JavaScript定义函数时,它将打包定义函数的上下文(在本例中,它是全局上下文)并将其与函数的作用域链相关联 . 此时,匿名函数将知道步骤1中的所有变量和函数定义,其中包括var b未定义 .

  • 因为JavaScript看到函数被用作变量赋值中的表达式,所以它将评估函数表达式 . 当它评估函数表达式时,它将再次将本地作用域内的所有变量和函数定义提升到顶部,如果此函数表达式中有任何函数声明语句,它将打包此本地上下文并将其添加到作用域链中这个功能 .

  • 在计算函数时返回函数对象,然后将函数对象分配给var b .

如果你可以评论每个版本,让我知道我的理解是否准确,那就太好了 .

1 回答

  • 0

    理论很好,但在现实生活中,浏览器使用自己的方言(因为使用自己的引擎并添加浏览器糖果) .

    例如,IE并不关心你的脚本标签指定'text / javascript' . 无论如何它都会使用自己的JScript .

    所以(设计一个多语言EcmaScript方言)它有助于理解该理论在现实生活中可能不会以相同的方式工作 .

    例如,命名函数表达式被视为BOTH - IE中的函数声明AND函数表达式(JScript):

    typeof g; // "function"
    var f = function g(){};
    

    请参阅此链接以了解其中一些示例:
    http://kangax.github.com/nfe/#jscript-bugs

    实际上,这是一个相当完整的'semi-official'(来自MS的Pratap Lakshman)对ES4的JScript偏差的概述:
    http://wiki.ecmascript.org/lib/exe/fetch.php?media=resources:jscriptdeviationsfromes3.pdf

    最后我在JavaScript上 - 克罗克福德 - 第三幕:功能终极':
    http://youtu.be/ya4UHuXNygM

    希望这可以帮助!

相关问题