意外结果:为什么访问未定义的变量不会抛出错误?

时间:2014-04-10 15:57:02

标签: javascript

var a = {
    name: 'zhangsan',
    getName: function() {
        alert(name)
    }
};
a.getName();

为什么警告""而不是this前面没有name的错误?

5 个答案:

答案 0 :(得分:2)

在名为name的窗口对象上有一个属性,其默认值为"" http://www.w3schools.com/jsref/prop_win_name.asp

答案 1 :(得分:2)

因为在这一行:

alert(name);

... name是一个简单的变量引用。在这种情况下,它解析为全局变量name(窗口的名称,因为全局变量是全局对象的属性,浏览器上的全局对象是窗口)。

要使用对象的name属性,必须明确地执行此操作:

alert(this.name);

答案 2 :(得分:1)

name未在您的函数范围和它的父级(window)中定义(由您)。要引用对象本身,您必须使用this

var a = {
    name: 'zhangsan',
    getName: function() {
        alert(this.name);
    }
};
a.getName();

PS:显然window.name确实存在,并且代码中的name指的是它,因此不会抛出错误但返回的值不正确。

答案 3 :(得分:0)

这很容易理解:

var name = "asdasdasd";
var a = {name: 'zhangsan', getName: function() {
    alert("A name : " + name);
    alert("A this.name : " + this.name);
}};
var b = {name: 'BBBBasfdasdasd', getName: function() {
    alert("B name : " + name);
    alert("B this.name : " + this.name);
}};

a.getName();
b.getName();

您可以在此处试用:http://jsfiddle.net/jvEq2/1/

答案 4 :(得分:0)

在您的函数中,您没有使用引用对象本身的this

这样做:

var a = {name: 'zhangsan', getName: function() {
alert(this.name)}
};
a.getName();

另外我认为你已经有了一个全局变量名,其值为"",否则你应该有ReferenceError