【问题标题】:What is the difference between these two particular JavaScript functions? [duplicate]这两个特定的 JavaScript 函数有什么区别? [复制]
【发布时间】:2012-04-17 15:53:50
【问题描述】:

可能重复:
The difference between the two functions? (“function x” vs “var x = function”)
JavaScript: var functionName = function() {} vs function functionName() {}

var test = function() {
    var a = 20;
    var b = 30;

    return a + b;
};

function Add() {
    var a = 20;
    var b = 30;

    return a + b;
}

这两个函数有什么区别?如果我调用 add() 或 test() 它们都会给我相同的结果。 var 到底是做什么的?

【问题讨论】:

  • @KendallFrey:不要编辑可能的欺骗消息。
  • 如果您因为它是骗子而对这篇文章投反对票,请考虑它最初不是在stackoverflow中发布的,因此OP无法像您一样轻松搜索骗子想想。

标签: javascript


【解决方案1】:

函数声明语法不能在块语句中使用。

法律:

function a() {
    function b() {

    }
}

非法:

function a() {
    if (c) {
        function b() {

        }
    }
}

你可以这样做:

function a() {
    var b;
    if (c) {
        b = function() {

        };
    }
}

对于我们中间的语言书呆子,您需要参考规范的第 12.1、13.1 和 14 节。您将找到以下语法说明。

12.1 块

语法

阻止:
{ StatementListopt}

声明列表:
声明
StatementList 声明

13 函数定义

语法

功能声明:
function 标识符 ( FormalParameterListopt) { FunctionBody }

函数表达式:
function 标识符opt( FormalParameterListopt) { FunctionBody }强>

正式参数列表:
标识符
FormalParameterList ,标识符

函数体:
源元素

14 程序

语法

程序:
源元素opt

源元素:
源元素
源元素源元素

源元素:
声明
函数声明

【讨论】:

  • 除了我的失态之外,这在 ECMA-262 规范中是否明确宣布为非法,如果是,在哪里?
  • @kojiro - 是的,当然让我包括在内。
  • @kojiro - 健康地混合了 markdown 和 html,但我已经包含了懒惰的语法。 :)
【解决方案2】:

他们是不同的。 如果你在声明之前调用使用var声明的函数,它会抛出一个错误,因为它还没有被声明。

test(); // Undefined
var test = function() {
    ...
};

这可以在任何时候调用并在运行时定义。

test(); // OK
function test() {
    ...
};

【讨论】:

    【解决方案3】:

    不同之处在于,在第一种情况下,您有一个匿名函数,而在第二种情况下,您有一个函数声明。在大多数情况下,这种差异并不重要。重要的是

    1. 在调试器中,命名函数有时可以更容易地在堆栈跟踪中识别,并且
    2. 变量提升导致整个函数声明被“移动”到其包含函数的顶部,所以

      foo(1, 2); var foo = 函数 (a, b) { 返回 a+b; }

    等价于

    var foo;
    foo(1, 2);
    foo = function (a, b) {
        return a+b;
    }
    

    (你可以看到它为什么会失败。)

    【讨论】:

      【解决方案4】:

      您可以在定义之前调用 Add(),但不能在定义之前调用 test()。

      另见var functionName = function() {} vs function functionName() {}

      【讨论】:

        【解决方案5】:

        var 表示您将变量分配给匿名函数。如果您要将函数分配给变量,您可以这样做:

        var test = function Add() {
            var a = 20;
            var b = 30;
        
            return a + b;
        };
        

        你必须命名你正在使用的函数。

        您不必将函数分配给变量,但如果您想保留函数中的数据,那么您应该将函数分配给变量,因此您可以使用上面的代码。

        【讨论】:

          【解决方案6】:

          您分配的第一个函数是变量测试变量的匿名函数。那么变量 test 就变成了 test() 函数。

          【讨论】:

            猜你喜欢
            • 2011-02-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-03-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-08-13
            相关资源
            最近更新 更多