我知道这是一个愚蠢的例子 - 但为什么这段代码会导致错误,即条形未定义。不会javascript看看bar是否是“this”对象的属性。我知道添加这个,解决了问题 - 但这往往会让我失望。例如,在其他编程语言(C#)中,这通常是多余的 - 为什么需要在下面的代码中添加它?
var myObject = {
foo : function(){
alert(bar);
},
bar : "hello world"
};
myObject.foo();
答案 0 :(得分:1)
因为,正如您所演示的那样,JavaScript使用this
而不是启动变量查找。
答案 1 :(得分:1)
javascript不会查看bar是否是“this”对象的属性
没有。它查看范围内的变量,而不是当前上下文的成员属性。
答案 2 :(得分:1)
Javascript具有功能范围,而不是对象范围。
只有在同一函数中声明的标识符在本地范围内,其他所有内容都从全局范围访问。
答案 3 :(得分:1)
它只是不起作用。它可能有,但语言设计者可能认为这种方式会导致效率低下,含糊不清和代码很难看到发生了什么。
我承认,我有时也会因为必须先加上“这个”而烦恼。对事物,甚至更恼火的是我不断地说“var self = this;”,但这就是Javascript中的生活。你只需要接受它,然后继续前进。
答案 4 :(得分:0)
这样想:
var myObject = {
foo : null,
bar : "hello world"
};
myObject.foo = function(){
alert(bar);
}
现在,bar
应该引用什么?正如您现在可以更容易地看到的那样,bar
不在范围内。
在C#中,方法属于对象,并且知道它们具有什么属性,这就是为什么这样的事情是可能的。但是在JavaScript中,你没有那些知识,“方法”不属于,属性是动态的,这使得这样的范围规则不可行。
答案 5 :(得分:0)
在javascript中,查找优先级是祖先函数作用域(可以嵌套,与C ++和Java不同),从最近的执行代码到最远的代码。
在这个简单的例子中,看起来有一个隐含的this
会有意义,但指定和使用不同级别的嵌套函数和对象会更复杂。
(function() {
var myVar = "dsjsh";
return {
myVar: "var",
myMethod: function() {
/* which */ myVar;
};
}
})()
显然,这种语言选择了简单性(至少在这个问题上)。
答案 6 :(得分:0)
JavaScript并不完全具有类或类范围的概念; myObject
应该被视为一张地图,而不是一个对象。例如,您可以这样做:
function foo() {
alert(this.bar);
}
var myObject = {
bar: "hello world"
};
myObject.foo = foo;
在这种情况下,为什么foo
知道myObject
何时定义?当您致电myObject.foo()
时,JavaScript会将myObject
作为this
传递(当然,JavaScript关于此的范围规则有点奇怪,因此this
不是&#39 ; t总是你的想法),你可以通过myObject
访问this
。如果您刚刚拨打foo()
,this
会有所不同(在浏览器中,它可能是window
),甚至访问this.bar
也不会有效。