2

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

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

    myObject.foo();

http://jsfiddle.net/Mv86n/

4

7 回答 7

1

javascript不会查看bar是否是“this”对象的属性

不。它查看哪些变量在范围内,而不是哪些属性是当前上下文的成员。

于 2012-11-19T20:44:09.693 回答
1

它只是不那样工作。它可能有,但语言设计者可能认为这种方式会导致效率低下、模棱两可和难以看到发生了什么的代码。

我承认,有时我也对在前面加上“this”的必要性感到恼火。更恼火的是我经常不得不说“var self = this;”,但这就是 Javascript 中的生活。你只需要接受它的本来面目,然后继续前进。

于 2012-11-19T21:15:15.360 回答
1

Javascript 有函数作用域,而不是对象作用域。

只有在同一函数中声明的标识符在本地范围内,其他所有内容都在全局范围内访问。

于 2012-11-19T21:03:45.257 回答
0

在 javascript 中,查找优先级是从最近执行的代码到最远的祖先函数范围(可以嵌套,与 C++ 和 Java 不同)。

在那个简单的例子中,看起来隐式this是有意义的,但是指定和使用不同级别的嵌套函数和对象会复杂得多。

(function() {
    var myVar = "dsjsh";
    return {
        myVar: "var",
        myMethod: function() {
            /* which */ myVar;
        };
    }
})()

显然,语言做出了简单的选择(至少在这个问题上)。

于 2012-11-19T20:51:44.643 回答
0

JavaScript 并不完全有类范围的概念;myObject应该被认为是一张地图,而不是一个物体。例如,您可以这样做:

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

在这种情况下,为什么要foo知道myObject它的定义时间?当你调用 时myObject.foo(),JavaScript 会传入myObjectas this(当然,JavaScript 的范围规则关于这个有点奇怪,所以this并不总是你认为的那样),你可以myObject通过this. 如果您只是调用foo()this将会有所不同(在浏览器中,它可能是window),甚至访问this.bar也不起作用。

于 2012-11-19T20:52:51.167 回答
0

这样想:

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

现在,bar应该指的是什么?正如您现在可以更轻松地看到的那样,bar不在范围内。

在 C# 中,方法属于对象,并且知道它们具有哪些属性,这就是为什么这样的事情是可能的。但是在 JavaScript 中,你没有这些知识,“方法”不属于,属性是动态的,这使得这样的范围规则不可行。

于 2012-11-19T20:50:18.693 回答