2017-02-14 61 views
1

jQuery中單擊功能被定義爲.click(handler),爲什麼我不能做到以下幾點:爲什麼a.click(b.toggle)不起作用?

var object1 = $("#object1"); 
var object2 = $("#object2"); 
object1.click(object2.toggle); 

以下,然而,工作原理:

var object1 = $("#object1"); 
var object2 = $("#object2"); 
object1.click(function() { object2.toggle(); }); 

現在的問題是,爲什麼我必須將函數處理函數封裝在另一個函數中才能使其工作?我知道,在第一個例子中,toggle功能將接收所有事件數據,但似乎並沒有影響(也,也會有相同的其他功能,如showhidefadeIn等)

UPDATE:

關於爭論,這也似乎工作:

var object1 = $("#object1"); 
var object2 = $("#object2"); 
object1.click(function(ev) { object2.toggle(ev); }); 

所以,無效的論點似乎並不成爲一個問題。

答:

問題的解釋是什麼@SeanWessell說,這裏是一個展示的jsfiddle在某種程度上,我的理解是更好的問題。但它與jQuery無關:https://jsfiddle.net/diegojancic/nffcnu8t/

+0

嘛'點擊()'方法需要一個回調,你才能把它需要的功能。 ECMA腳本6中可能有一種方法可以關閉,但我不確定。 – Nicolas

+0

'toggle'也是一個函數,應該是一個有效的回調,因爲我看到它。 –

+0

@charlietfl click函數只接收一個參數,如果我做了'function(a,b,c){}',那麼'b'和'c'是'undefined'。 –

回答

1

這是行不通的,因爲它會處理程序分配給點擊事件作爲

function (speed, easing, callback) { 
     return speed == null || typeof speed === "boolean" ? 
      cssFn.apply(this, arguments) : 
      this.animate(genFx(name, true), speed, easing, callback); 
    } 

當您嘗試分配處理類似object1.click(object2.toggle);這是一樣的事情了。

object1.click(
    function(speed, easing, callback) { 
    return speed == null || typeof speed === "boolean" ? 
     cssFn.apply(this, arguments) : 
     console.log(this) 
    this.animate(genFx(name, true), speed, easing, callback); 
    } 
); 

處理程序不關心在您的示例中對object2的引用。它將採用由jquery定義的切換函數,並將其作爲處理程序分配,但不再鏈接。

指定像object1.click(object2.toggle);這樣的處理程序需要從object2.toggle的字面上的函數並將其作爲處理程序應用。這與將一個對象的屬性應用於另一個對象相同。

var obj1 = { 
"prop1":"obj1PropValue" 
}; 

var obj2 = { 
"prop1":"obj2PropValue" 
} 

obj1.prop1 = obj2.prop1; 

儘管obj2.prop1是從obj1分配的,但並不關心屬性來自哪個對象,而只關心分配的值。同樣的想法適用於JavaScript中的功能。

函數不過是一個屬性VALUE。價值是關鍵字。

JavaScript是基於簡單的基於對象的範例設計的。一個對象是 屬性的集合,屬性是名稱(或關鍵字)與值之間的關聯。屬性的值可以是一個函數,在 中,該屬性被稱爲方法。除了在瀏覽器中預定義的對象 之外,您還可以定義自己的對象。 本章介紹如何使用對象,屬性,函數和方法,以及如何創建自己的對象。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects

+0

不知道我明白了。你能解釋一下嗎?我在您發佈的代碼中看到,回調函數正在直接傳遞給'animate'函數。 –

+0

你正在分配處理程序作爲我上面發佈的函數。它不再是連接到jQuery的鏈接事件。它就像這個小提琴一樣將功能拉出來。 https://jsfiddle.net/SeanWessell/997wq7te/因此沒有更多的引用'this',這是鏈式jQuery對象。由於該函數不再鏈接到jQuery對象,因此genFX不在範圍之內。我把這個console.log放入函數中,它現在是clicked元素,而不是鏈接到object2。 –

+0

你的例子顯然不起作用。你做'object1.click(toggle);''但'toggle'沒有任何對象的引用。做'object1.click(function(){toggle();});'在你的例子中也不起作用。 –

0

從語法的角度看,這是可以接受的,但由於調用上下文而無法正確執行。如果以這種方式引用函數(而不是包裝在通過元素調用的另一個函數中),this綁定將無法正確映射,因此代碼將不知道要切換的內容。

+0

這個和@SeanWessell的答案似乎是正確的,但都沒有解釋爲什麼'this'綁定或上下文丟失。來自C#,這是沒有意義的。謝謝。 –

+1

JavaScript中的'this'與其他語言有很大不同。在JavaScript中,它是不穩定的。 'this'綁定的對象並不基於代碼中出現'this'的位置(就像C#中的情況一樣)。它由觸發代碼的範圍內的對象決定。 –

+0

看到這個:http://stackoverflow.com/questions/41496958/this-does-not-work-properly-in-another-event-im-clueless-as-to-why/41496969#41497008爲另一個答案,我寫這更詳細地解釋了這一點。 –