Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/477.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 创建为var的函数不';没有.name属性。为什么?_Javascript_Function_Object - Fatal编程技术网

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

Javascript 创建为var的函数不';没有.name属性。为什么?,javascript,function,object,Javascript,Function,Object,今天在一次关于JS的演讲中,我们(学生)被告知在JavaScript中,一切都是一个对象。例如,提供了以下代码: // functions are objects function aFunction(a, b) { // do something }; console.log(aFunction.name); // aFunction 我发现这很有趣,并决定尝试声明为var funcName=function(…的函数是否会以相同的方式运行。它不会: function aFunct

今天在一次关于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

为什么?

这是一个未命名的函数。有时称为“匿名”函数或“lambda”

如果你想给它命名,你可以

var bFunction = function bFunction(a, b) {
    return a + b;
};
但这有点多余,如果希望命名函数,最好只将其作为命名函数编写

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

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

至于下面的注释,使用命名函数的不太明显的好处是它们的stacktrace更好。也就是说,如果您经常在代码中使用匿名函数,并且其中一个函数中出现错误,stacktrace的信息将不会太多

比较匿名函数错误

(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)
(函数(){undefined.x;})()
//=>未捕获类型错误:无法在2:24读取未定义的属性“x”
Vs命名函数错误

(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)
(函数foo(){undefined.x;})()
//=>未捕获的TypeError:无法读取foo处未定义的属性“x”(:2:28)

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

只是因为您没有为它指定名称

var bFunction=函数bFunction(a,b){
返回a+b;
};

alert(bFunction.name);//更改为alert,因为它能更好地处理代码段
,这是因为它是匿名函数,没有名称。调用
name
属性的匿名函数将返回空字符串

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

alert(bFunction.name);

虽然如果变量的名称与函数声明的名称相同,这是多余的可能有意义。@Touffy我发现让它们具有相同的名称是有意义的,因为您通过变量名引用它们,但函数名在堆栈跟踪中使用。不,@ryachza,这没有意义,因为具有名称的函数语句将自动创建具有该名称的局部变量,甚至会“提升”它在范围内。@Touffy我不确定我是否理解。例如,
var a=function test(x){console.log('here');};test(0);
throws with
test未定义
@ryachza yes。我在几分钟前修正了前面的注释,改为“function statement”。这与函数定义类似,只是它没有包含在更大的语句中,即它以
function
开头。您知道
var test=function test(){}
只做
function test(){}
,对吗?这就是我的观点。“在JavaScript中,一切都是对象”---您被误导了。
“cthulhu”
不是对象。
-4
不是对象。
true
不是对象。
未定义的
不是对象。@g.kertesh您确定吗?尝试
控制台.log(“ctulhu.toUpperCase())
在这种情况下,会自动创建一个新的临时对象。尝试
var c=“cthulhul”;c.prop=5;console.log(c.prop);
以查看您无法将属性分配给原语。他们可以访问
名称
属性;只是没有一个属性集。我无意听起来像是在唠叨,但您的编辑也不正确。它将返回
(空字符串),不是未定义的。谢谢。每天学习新东西