2012-11-19 36 views
2

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

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

    myObject.foo(); 

http://jsfiddle.net/Mv86n/

+0

你需要阅读关于javascript范围链以及它如何遍历它寻找对象。 – Modika

回答

1

难道JavaScript的样子,看看吧是

号它看起来的 “此” 对象属性在什么变量的范围内,而不是什么属性的成员的当前情况。

0

认为它是这样的:

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

现在,什么是bar应该是指什么?正如您现在更容易看到的,bar不在范围内。

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

0

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

在这个微不足道的例子中,看起来有一个隐含的this是合理的,但是指定和使用不同级别的嵌套函数和对象会复杂得多。

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

显然,语言选择简单(至少对于这个问题)。

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并非总是您认为的),您可以通过访问myObject。如果你只是打电话foo(),this会有所不同(在浏览器中,它可能是window),甚至访问this.bar将不起作用。

1

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

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

1

它只是不这样工作。它可能有,但语言设计师可能认为这样会导致效率低下,模糊和代码,很难看到发生了什么。

我承认我有时会因为必须预先加入“this”而感到烦恼。到事情,甚至更恼火,我不断不得不说“var self = this;”,但这是在Javascript中的生活。你只需要接受它,然后继续。

相关问题