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

时间:2015-09-03 07:44:40

标签: javascript

声明这样的对象时:

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 = ...)都可以。为什么呢?

2 个答案:

答案 0 :(得分:2)

这种情况正在发生,因为name is a existing property on window与正常变量的行为略有不同。

您无法替换此属性,您只能为其指定字符串值。将其他类型分配给name属性时,会将其强制转换为字符串:

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 :(得分:1)

没有任何封闭范围,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()); 
}()