为什么不能存储jQuery方法?

3

使用jQuery似乎无法实现此功能:

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

在Chrome浏览器中,它给了我这个错误:“TypeError: Object [object global] has no method 'empty'”,为什么会这样呢?http://jsfiddle.net/bdN4z/

2
这取决于你如何调用函数。这就是底线。 - elclanrs
2
http://jsfiddle.net/bdN4z/1/ - elclanrs
1
因为函数的执行上下文将会不同。 - Arun P Johny
在我看来,这很丑陋,但你可以将其包装在另一个函数中:f = function(x){$("#second").text(x);}; 演示 - Moob
2个回答

4

text函数在内部使用this值。

this的值取决于如何调用函数。

当您调用$("#someElement").text()时,您是在jQuery实例的上下文中调用它。jQuery实例具有一个empty方法。

当您调用f()时,您是在默认对象(window)的上下文中调用它。window没有empty方法。


我明白了。不过那种情况有点糟糕,我遇到它是当我试图通过将文本函数作为来自Ajax调用的结果回调传递时变得聪明 :) - monoceres

2
您需要为该方法提供上下文才能使其正常工作...
这个怎么样?
someElement = $("#someElement");
f = someElement.text.bind(someElement);
f("Bar!")

或者在jQuery中:f = $.proxy($.fn.text, someElement);f = $.fn.text.bind(someElement); - A. Wolff
这有点违背初衷,我试图通过将文本函数作为回调来变得聪明,而简单的解决方案是稍微不那么聪明,将其传递到闭包中 :) - monoceres
@monoceres 但是你可以在回调方法中设置上下文,那么你的问题是什么呢? - A. Wolff
@A.Wolff同意。无论如何,我认为这些解决方案在创建每个字符和每个毫秒都很有价值的框架时非常有用,否则我会选择可读性更好的解决方案,比如getChangeTextFn = function (el) {return function (newText) {el.text(newText);};};,这样如果一个初级开发者两个月后再看它,他不会再去stackoverflow上寻找答案。 - Mabedan
我认为包装它更易读,而且不那么“hacky”。请比较我的代码的两个不同版本:http://pastebin.com/B2Q7vBjm - monoceres

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接