创建为var的函数没有.name属性。为什么?

时间:2015-09-29 20:09:31

标签: javascript function object

今天在关于JS的演讲中,我们(学生)被告知在JavaScript中,一切都是对象。例如,提供了此代码:

// functions are objects
function aFunction(a, b) {
    // do something
};

console.log(aFunction.name); // aFunction

我发现这很有趣,并决定尝试声明为var funcName = function(...的函数的行为方式相同。它没有:

function aFunction(a, b) {
    return a + b;
}

var bFunction = function(a, b) {
    return a + b;
};

console.log(aFunction.name); // aFunction
console.log(bFunction.name); // empty string

为什么?

3 个答案:

答案 0 :(得分:7)

这是一个未命名的功能。有时被称为"匿名"功能或" lambda"。

function(a, b) {
    return a + b;
}

如果你想要它命名,你可以做

var bFunction = function bFunction(a, b) {
    return a + b;
};

但这有点多余,如果你希望命名你的函数,最好把它写成命名函数

function bFunction(a, b) {
    return a + b;
};

bFunction;       //=> function bFunction(a,b) { ... }
bFunction.name;  //=> "bFunction"

至于下面的评论,使用命名函数的不那么明显的好处是它们堆栈跟踪更好。也就是说,如果您经常在代码中使用匿名函数,并且其中一个函数发生错误,则堆栈跟踪将不会提供太多信息。

比较匿名函数错误

(function() { undefined.x; })()

//=> Uncaught TypeError: Cannot read property 'x' of undefined at <anonymous>:2:24

判断命名函数错误

(function foo() { undefined.x; })()

//=> Uncaught TypeError: Cannot read property 'x' of undefined at foo (<anonymous>:2:28)

注意命名函数stacktrace如何提及foo,这有助于我们识别包含错误的函数。

答案 1 :(得分:4)

那是因为它是一个匿名函数,它没有名字。调用name属性的匿名函数将返回一个空字符串。

var bFunction = function bFunction(a, b) {
    return a + b;
};

alert(bFunction.name);

答案 2 :(得分:2)

只是因为你没有给它指定一个名字。

var bFunction = function bFunction(a, b) {
    return a + b;
};

alert(bFunction.name); // changed to alert since it works better with the snippets