2016-05-14 66 views
2

See the jsfiddle.

當我運行下面的代碼:

var divs = $('div'); 

    // The first three methods of showing a div work 
    divs.eq(0).show(); 
    (divs.eq(1).show)(); 
    var f = function() { 
    divs.eq(2).show(); 
    } 
    f(); 

    // But this doesn't. Why? 
    var g = divs.eq(3).show; 
    g(); 

最後一種方法不顯示DIV,而且也沒有錯誤在控制檯中。我想使用它,因爲我想簡潔地存儲函數而不創建匿名函數塊。這正是我通常在Python中所做的。我無法理解這裏出了什麼問題。

編輯:評論是不是真的幫助我瞭解問題。 this怎麼會迷路?它改變了什麼,爲什麼?爲什麼不會發生(divs.eq(1).show)();

+0

這是一個有趣的問題! –

+5

'.show()'取決於'this'的值,當你單獨訪問方法並將其調用爲單獨的步驟時,該值會發生變化。 [在JavaScript原型函數中保留對「this」的引用](http://stackoverflow.com/questions/2025789/preserving-a-reference-to-this-in-javascript-prototype-functions)以及[這個「關鍵字工作?」(http:// stackoverflow。com/questions/3127429/how-do-this-keyword-work) –

+2

結果是一個沒有上下文的函數 – charlietfl

回答

3

正如評論中已經解釋的那樣,它不起作用,因爲show()取決於值this

this值取決於一個功能是如何稱爲

  • 當稱爲「正常」功能(foo()this將指全局對象或undefined(當在嚴格模式)。
  • 當作爲對象方法調用時(obj.foo()),this引用對象(obj)。

瞭解如何在JS中工作this是至關重要的。請參閱:

+0

爲什麼?爲什麼不保留'this'的價值?我可以隨時輕鬆地獲取全局對象或「undefined」。 –

+1

@Alex:因爲函數是第一類對象。他們不屬於任何東西。考慮以下內容:'var foo = {bar:function(){}}; var foo2 = {bar:foo.bar};'。當我調用'foo2.bar()'時,'this'應該指什麼?這就是JavaScript的設計方式,以及它如此靈活的原因。 Python是不同的,因爲類方法自動綁定到實例。 –

+0

好的,這使得它更清晰。 –

0

當您撥打g()時,this的值未設置爲divs.eq(3)。這是修復它的一種方法。

divs.eq(0).show(); 
(divs.eq(1).show)(); 
var f = function() { 
    divs.eq(2).show(); 
} 
f(); 

var div3 = divs.eq(3); 
var g = div3.show; 
g.call(div3); 
+0

*「this'的值被設置爲調用函數」*否,不是。 –

+0

@FelixKling我的錯誤。我修好了它。 – cambunctious

0

divs.eq(3).show是這個函數的代碼(檢查出來的console.log(g)):

(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(mb(b,!0),a,d,e)} 

this是人們一直指的。

功能g需要適用於某些東西。第一種情況是a jQuery element(div)。在第二種情況下,它是#document元素。

+0

爲什麼文檔元素?那會是什麼目的? –

+0

最初,'g'函數是jQuery對象的一部分。通過參考,你「從功能元素中取出了功能的副本」。由於現在'g'屬於文檔(請記住'document.ready'上下文),它在那裏應用。 – rollingBalls

+0

*「這是#文檔元素。」* - 不是「窗口」嗎? – nnnnnn

相關問題