[英]How do I redefine `this` in Javascript?
我有一个函数,它是一个JQuery事件处理程序。 因为它是一个JQuery事件处理程序,所以它使用this
变量来引用调用它的对象(对于该库来说是正常的)。
不幸的是,我需要在此时手动调用该方法。 如何让我this
被调用函数的行为里面,就好像它是从JQuery的叫什么?
示例代码:
function performAjaxRequest() {
//Function which builds AJAX request in terms of "this"
}
function buildForm(dialogOfForm) {
var inputItem;
dialogOfForm.html('...');
dialogOfForm.dialog('option', 'buttons', {
"Ok" : performAjaxRequest
});
inputItem = dialogOfForm.children(':not(label)');
//Redirect enter to submit the form
inputItem.keypress(function (e) {
if (e.which === 13) {
performAjaxRequest(); //Note that 'this' isn't the dialog box
//as performAjaxRequest expects here, it's
//the input element where the user pressed
//enter!
}
}
}
您可以使用函数的call
方法。
someFunction.call(objectToBeThis, argument1, argument2, andSoOnAndSoOn);
如果dialog
是你需要设置到对象this
则:
performAjaxRequest.apply(dialog, []);
// arguments (instead of []) might be even better
应该做的伎俩。
否则,在jQuery中,您只需在要设置this
元素的元素上调用trigger
方法即可
例如,假设您希望按钮上发生click
事件,您现在需要它。 只需致电:
$("#my_button").trigger("click");
您的#my_button
的click
处理程序将被调用,并且this
将被设置为#my_button
元素。
如果您需要调用一个不同的方法this
......比方说,与this
指的是jQuery对象本身,那么你将要使用call
或apply
上的功能。
Chuck和meder已经给你了每个例子...但是把所有东西放在一个地方:
// Call
my_function.call(object_to_use_for_this, argument1, argument2, ... argumentN);
// Apply
my_function.apply(object_to_use_for_this, arguments_array);
看看: 一个名单除了结合的情况
你在找...
functionRef.apply( objectContext, arguments);
您当然应该学会掌握call()
和apply()
因为人们已经说过,但是一个小帮手永远不会伤害...
在jQuery中,有$ .proxy 。 在纯粹的js中,你可以用以下内容重新创建那个漂亮的东西;)
function proxyFn( fn , scope ){
return function(){
return fn.apply(scope,arguments);
}
}
用法示例:
var myFunctionThatUsesThis = function(A,B){
console.log(this,arguments); // {foo:'bar'},'a','b'
};
// setTimeout or do Ajax call or whatever you suppose loses "this"
var thisTarget = {foo: 'bar'};
setTimeout( proxyFn( myFunctionThatUsesThis, thisTarget) , 1000 , 'a', 'b' );
// or...
var contextForcedCallback = proxyFn( myAjaxCallback , someObjectToBeThis );
performAjaxRequest(myURL, someArgs, contextForcedCallback );
如果你不滥用它,这是一个永远不会失去“这个”范围的可靠工具。
使用一个闭包,即尽早将其分配给它; 然后你可以用它做你喜欢的事。
var that = this;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.