Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaScript中为变量赋值时,使用命名函数的目的是什么?_Javascript - Fatal编程技术网

在JavaScript中为变量赋值时,使用命名函数的目的是什么?

在JavaScript中为变量赋值时,使用命名函数的目的是什么?,javascript,Javascript,我最近在源代码中遇到了这种模式: 在将函数赋给变量或对象属性时,将函数命名为“packageJSON”的目的是什么?我总是在类似的情况下使用匿名函数。用于调试目的。如果使用命名函数,则可以在您喜爱的开发工具中的调用堆栈跟踪中看到该名称。否则,您将看到名为a(或NFE)的匿名函数,它使调试过程更加容易 需要记住的一个重要细节是,此名称仅在中可用 新定义功能的范围;规范要求 标识符不应可用于封闭范围: 正如其他人所说,主要用于调试目的。但不仅如此。例如,您可以依赖这样一个事实:在函数体中,您可以使用

我最近在源代码中遇到了这种模式:


在将函数赋给变量或对象属性时,将函数命名为“packageJSON”的目的是什么?我总是在类似的情况下使用匿名函数。

用于调试目的。如果使用命名函数,则可以在您喜爱的开发工具中的调用堆栈跟踪中看到该名称。否则,您将看到名为a(或NFE)的匿名函数,它使调试过程更加容易

需要记住的一个重要细节是,此名称仅在中可用 新定义功能的范围;规范要求 标识符不应可用于封闭范围:


正如其他人所说,主要用于调试目的。但不仅如此。例如,您可以依赖这样一个事实:在函数体中,您可以使用您设置的名称访问函数本身。举个愚蠢的例子:

var sum = function (a, b) {
    if (a < 3)
        return sum(3 + a, b);

    return a + b;
}

sum(1, 2) // 3;
命名函数将涵盖该用例:

var sum = function sum(a, b) {
    if (a < 3)
        return sum(3 + a, b);

    return a + b;
}

sum(1, 2) // 6

var aSum = sum;
sum = null;

aSum(1, 2) // 6
var sum=函数和(a,b){
if(a<3)
回报总额(3+a,b);
返回a+b;
}
和(1,2)//6
var aSum=总和;
总和=零;
aSum(1,2)//6

这是因为在函数体中,函数的名称总是引用它,而不是像第一个示例那样从另一个作用域中获取。

否则,该函数在控制台中将没有名称,您将很难跟踪谁调用了下一个。这是我的第一个想法,但是,它不会仍然显示在它被分配到和调用的对象属性的名称下吗?该名称不会仍然被JS代码缩略器(如Close或uglify)重新分配吗?没有人调试缩略的代码。缩小是在即将部署代码时完成的,而不是在开发代码时。给出答案,因为这几乎肯定就是为什么要这样做。
var sum = function (a, b) {
    if (a < 3)
        return sum(3 + a, b);

    return a + b;
}

sum(1, 2) // 3;
var aSum = sum;
sum = null;

aSum(1, 3); // TypeError: sum is not a function
var sum = function sum(a, b) {
    if (a < 3)
        return sum(3 + a, b);

    return a + b;
}

sum(1, 2) // 6

var aSum = sum;
sum = null;

aSum(1, 2) // 6