2012-11-19 35 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中的生活。你只需要接受它,然後繼續。

相關問題