2014-02-14 3 views
3

кажется, что вы не можете сделать это с помощью JQuery:Почему методы jQuery не могут быть сохранены?

f = $("#someElement").text 
f("Bar!") 

На хроме это дает мне эту ошибку: «Ошибка типа: Object [объект глобальной] не имеет какого-либо метода" пустой»

Почему?

http://jsfiddle.net/bdN4z/

+2

'this' зависит от того, как вы вызываете функцию. Вот в чем суть. – elclanrs

+2

http://jsfiddle.net/bdN4z/1/ – elclanrs

+1

потому что контекст выполнения функции будет отличаться –

ответ

4

text функция использует this значение внутренне.

Значение this зависит от того, как вы вызываете функцию.

Когда вы вызываете $("#someElement").text(), вы вызываете его в контексте экземпляра jQuery. У экземпляров jQuery есть метод empty.

Когда вы вызываете f(), вы вызываете его в контексте объекта по умолчанию (window). window не имеет метода empty.

+0

Я вижу. Тем не менее, я столкнулся с этим, когда попытался быть умным, передав текстовую функцию в результате обратного вызова из вызова ajax :) – monoceres

2

Вам нужно будет предоставить контекст для метода, чтобы работать должным образом ...

как об этом?

someElement = $("#someElement"); 
f = someElement.text.bind(someElement); 
f("Bar!") 
+0

или 'f = $ .fn.text.bind (someElement);' или в jQuery : 'f = $ .proxy ($. fn.text, someElement);' –

+0

Такой вид побеждает, я пытался быть умным, передавая текстовую функцию в качестве обратного вызова, простое решение должно было быть немного меньше умный и передающий его внутри замыкания :) – monoceres

+0

@monoceres, но вы можете установить контекст на метод обратного вызова, какова ваша проблема? –

Смежные вопросы