JavaScript函数访问对象属性
一些愚蠢的问题,但是。。为什么以下代码只返回空字符串:JavaScript函数访问对象属性,javascript,Javascript,一些愚蠢的问题,但是。。为什么以下代码只返回空字符串: var a = { name:"321", foo: function(){ console.log(name); } } a.foo(); 因为您没有将名称的作用域限定为任何对象,所以它正在寻找一个全局变量。 试着替换 console.log(name); 与 您可以像这样使用this关键字-console.log(this.name)。在代码的结果中,您会看到一个空字符串,而不是一个未定
var a = {
name:"321",
foo: function(){
console.log(name);
}
}
a.foo();
因为您没有将名称的作用域限定为任何对象,所以它正在寻找一个全局变量。 试着替换
console.log(name);
与
您可以像这样使用
this
关键字-console.log(this.name)代码>。在代码的结果中,您会看到一个空字符串,而不是一个未定义的错误,因为窗口。name
变量已经存在,并且与对象中的name变量没有任何关系
foo表示对象的函数作用域示例,bar表示回调的作用域
代码:
console.log(this.name)代码>检查浏览器的控制台。它不应该打印任何内容。将name
更改为this.name
,您将看到321
已打印@诺亚,实际上它会打印一些东西。空字符串!请参阅Good catch@patrick roberts,我知道“this.name”是有效的。我只是想知道为什么函数不能访问“name”属性。@user2598794,因为如果没有this
,代码将搜索一个名为name
的作用域变量,并且同一对象的另一个属性不在作用域内。如果您有一个全局变量名称
,您会看到它的值。@DrakaSAN为什么对象中的“name”不在范围内考虑?它从哪里开始搜索?@user2598794在您的示例中,它从a.foo
中开始,然后在全局代码中继续。我不知道为什么JS会这样做,尽管.JS是基于函数及其闭包构建的。关联的对象可以很容易地更改,单个函数可以位于多个对象中。我只注释了“1”名称,它会打印出“名称:3”。如果我注释了“1”和“3”,它会打印空字符串。看起来它根本看不到函数作用域。@user2598794:啊,是的,我忘了在这种情况下,它会跳转到全局作用域,而不是回调。我编辑了我的示例。
console.log(this.name);
var foo = "global",
bar = "global",
a = {
foo: (callback) => {
// var foo = 'local';
console.log('foo: ' + foo);
callback();
}
};
(() => {
// var bar = "parent";
a.foo(() => {
// var bar = "local";
console.log('bar: ' + bar);
});
})();