【问题标题】:Why can't I use 'name' as a variable/object name? [duplicate]为什么我不能使用“名称”作为变量/对象名称? [复制]
【发布时间】:2015-11-28 22:38:01
【问题描述】:

当像这样声明一个对象时:

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 = ...)都可以正常工作。为什么?

【问题讨论】:

  • 窗口对象有一个名为 name 的内置属性。您所有的全局名称都指向窗口,它是一个字符串。 console.log(window.name) 你会看到它是一个空字符串,你不能覆盖它
  • @Deepak 现在这个问题很有道理,这将是一个很好的答案。
  • @Luthando 1) 在短时间内,问题中的代码实际上 确实 工作得很好。 2) 如果你说它抛出错误,总是引用错误信息。它可能是一百万种不同的东西。仅凭这一点,反对票是合理的。
  • @LuthandoLoot 它被否决了,因为:没有提供错误消息 “它不起作用” 不是一个好的问题陈述。用户有变量var hello = { ... }(当我查看它时),它工作正常并且没有问题。但由于这些问题已得到解决,这就是我们删除它们的原因。不是因为我们没有正确阅读问题。
  • @LuthandoLoot 绝对是一个有效的问题,当您编写大量原版 javascript 时!

标签: javascript


【解决方案1】:

发生这种情况是因为 name is a existing property on window 的行为与普通变量略有不同。

你不能替换这个属性,你只能给它分配字符串值。将其他类型分配给 name 属性时,它被强制转换为字符串:

name = false;
var name = false;
window.name = false;

这些行都将导致window 具有包含"false" 的属性name

以类似的方式,保存到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));
})()

【讨论】:

    【解决方案2】:

    在没有任何封闭范围的情况下,var namewindow.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()); ?
    }()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-19
      • 1970-01-01
      相关资源
      最近更新 更多