gpt4 book ai didi

Javascript:不同形式的函数之间的区别

转载 作者:行者123 更新时间:2023-11-30 06:34:09 25 4
gpt4 key购买 nike

# 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:权威指南,我想确保我了解 JavaScript 如何处理这两个版本。我将在下面解释我对每个版本的理解:

版本 A

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

版本 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。

如果您能对每个版本发表评论并让我知道我的理解是否准确,那就太好了。

最佳答案

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

例如,IE 不关心您的脚本标签是否指定“text/javascript”。无论如何,它都会使用自己的 JScript。

因此(设计一种多语言 EcmaScript 方言)也有助于理解该理论在现实生活中可能不会以相同的方式起作用。

例如,在 IE(JScript) 中,命名函数表达式被视为既是函数声明又是函数表达式:

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

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

实际上,这是一个相当完整的“半官方”(来自 MS 的 Pratap Lakshman)关于 JScript 与 ES3 的偏差的概述:
http://wiki.ecmascript.org/lib/exe/fetch.php?media=resources:jscriptdeviationsfromes3.pdf

最后,我想指出这个非常有用的视频,其中 Douglas Crockford 在“Crockford on JavaScript - Act III:Function the Ultimate”中更详尽地解释了一些事情:
http://youtu.be/ya4UHuXNygM

希望这对您有所帮助!

关于Javascript:不同形式的函数之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15665565/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com