为什么不能使用“name”作为变量/对象名称?

4
当像这样声明一个对象时:
var name= {
    firsName:"nur",
    lastName:"jaman",
    fullName: function() {
        return this.firsName + " " + this.lastName;
    }
}
console.log(name.fullName());

它抛出了这个错误:

Uncaught TypeError: name.fullName is not a function

然而,使用任何其他变量名(例如var hello = ...)都可以正常工作。为什么?


4
window对象有一个内置属性叫做“name”。你的所有全局名称都指向window对象,并且它是一个字符串。使用console.log(window.name)可以看到它是空字符串,而且你无法覆盖它。 - Deepak David
2
@Deepak 现在问题有意义了,这将是一个很好的答案。 - deceze
2
@Luthando 1) 对于一个短时间内的问题,代码实际上是可以正常工作的。2) 如果你说它抛出了一个错误,一定要引用错误信息。这可能是无数不同的事情。仅仅因为这个原因就会被投票否决。 - deceze
1
@LuthandoLoot 这个回答被down-vote是因为没有提供错误信息,"It doesn't work"不是一个好的问题陈述。当我查看时,用户使用了变量var hello = { ... },它可以正常工作且没有问题。但由于这些问题已经被解决,所以我们将其删除,而不是因为我们没有正确阅读问题。 - Spencer Wieczorek
1
@LuthandoLoot 这是一个非常有效的问题,尤其当你写大量的纯 JavaScript 时!! - Deepak David
显示剩余5条评论
2个回答

5
这是因为 namewindow 上已有的属性,它的行为与普通变量略有不同。 你无法替换此属性,只能将字符串值分配给它。当将其他类型分配给名称属性时,它会被转换为字符串:
name = false;
var name = false;
window.name = false;

这些代码行都会使得window对象拥有一个名为name的属性,其值为"false"

类似地,保存在name变量中的对象和函数将被强制转化为字符串:

var name = function(){};  // "function (){}"
var name = { a: [1, 2] }; // "[object Object]"

如果您想使用名为“name”的变量,则必须将其封装在范围内:

// In the global namespace, this will alert `"[object Object]"`
var name = { a: 1};
alert('Global `name`: \n' +
      JSON.stringify(name));

// In it's own namespace, this will alert `{"a":1}`.
(function(){
  var name = { a: 1};
  alert('Namespaced `name`: \n' +
        JSON.stringify(name));
})()


1

如果没有任何封闭范围,var name 就是 window.name,它是一个本地属性,无法被替换或覆盖。你可以将一个 字符串 赋值给它,但即使这样,它仍然是具有特殊属性的对象:

> name
< "[object Object]"
> name.anchor
< function anchor() {
    [native code]
}
> name = null
> name
< "null"
> typeof name
< "string"
> name.anchor
< function anchor() {
    [native code]
}

请注意,当作用域限定时,整个事情运行得非常顺利:
function () {
    var name = { .. };
    console.log(name.fullName()); 
}()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接