为什么我需要将这个词添加到我的javascript方法中

时间:2012-11-19 20:42:06

标签: javascript this

我知道这是一个愚蠢的例子 - 但为什么这段代码会导致错误,即条形未定义。不会javascript看看bar是否是“this”对象的属性。我知道添加这个,解决了问题 - 但这往往会让我失望。例如,在其他编程语言(C#)中,这通常是多余的 - 为什么需要在下面的代码中添加它?

   var myObject = {
        foo : function(){
            alert(bar);
        },
        bar : "hello world"
    };

    myObject.foo();

http://jsfiddle.net/Mv86n/

7 个答案:

答案 0 :(得分:1)

答案 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也不会有效。