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

Javascript 意外结果:为什么访问未定义的变量不会引发错误?,javascript,Javascript,为什么它会提醒”,而不是在名称前面抛出一个没有此的错误?名称在函数的作用域和父函数(窗口)中都没有定义(由您定义)。要引用对象本身,必须使用this: var a = { name: 'zhangsan', getName: function() { alert(name) } }; a.getName(); PS:显然确实存在,并且代码中的name引用了它,因此没有抛出错误,而是返回了一个不正确的值。name没有(由您)在函数的范围和父函数(窗口)中定

为什么它会提醒
,而不是在
名称前面抛出一个没有
的错误?

名称
在函数的作用域和父函数(
窗口
)中都没有定义(由您定义)。要引用对象本身,必须使用
this

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

PS:显然确实存在,并且代码中的
name
引用了它,因此没有抛出错误,而是返回了一个不正确的值。

name
没有(由您)在函数的范围和父函数(
窗口
)中定义。要引用对象本身,必须使用
this

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

PS:显然确实存在,并且代码中的
name
引用了它,因此没有抛出错误,而是返回了错误的值。

窗口对象上有一个名为name的属性,默认值为“”

窗口对象上有一个名为name的属性,默认值为“”这很容易理解:

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

您可以在这里尝试:

这很容易理解:

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

您可以在此处尝试:

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

这样做:

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();

另外,我认为您已经有了一个全局变量名,其值为
,否则您应该在函数中得到
ReferenceError

,您没有使用引用对象本身的
this

这样做:

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();
另外,我认为您已经有了一个全局变量名,其值为
,否则您应该得到
ReferenceError

,因为在这一行中:

var a = {name: 'zhangsan', getName: function() {
alert(this.name)}
};
a.getName();
name
是一个简单的变量引用。在这种情况下,它解析为全局变量
name
(窗口的名称,因为全局变量是全局对象的属性,而浏览器上的全局对象是窗口)

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

alert(name);
因为在这一行:

var a = {name: 'zhangsan', getName: function() {
alert(this.name)}
};
a.getName();
name
是一个简单的变量引用。在这种情况下,它解析为全局变量
name
(窗口的名称,因为全局变量是全局对象的属性,而浏览器上的全局对象是窗口)

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

alert(name);


因为函数的作用域中没有名为
name
的变量。请尝试
alert(this.name)
在这种情况下,它应该返回一个错误,但它返回“”。
name
指的是
window.name
,因此不会引发错误@费利克斯克林:我忘了
窗口.名称
。这就可以解释了。因为函数的作用域中没有名为
name
的变量。请尝试
alert(this.name)
在这种情况下,它应该返回一个错误,但它返回“”。
name
指的是
window.name
,因此不会引发错误@费利克斯克林:我忘了
窗口.名称
。这就解释了。实际上,
window.name
存在;)否则代码将抛出一个引用错误。@FelixKling-完全忘记了!实际上,
window.name
存在;)否则代码将抛出一个引用错误。@FelixKling-完全忘记了!是的,更新了。在达到200个上限后,我的头脑不正常:)是的,更新了。在达到200上限后,我的头脑不正常:)非常感谢,我现在明白了。非常感谢,我现在明白了。我不明白这与问题有什么关系。他想知道为什么访问似乎是未声明的变量时没有抛出错误。通常这会导致引用错误。我不明白这与问题有什么关系。他想知道为什么访问似乎是未声明的变量时没有抛出错误。通常,这将导致引用错误,。