如何在Javascript中重新定义“this”?
我有一个函数,它是JQuery事件处理程序。因为它是一个JQuery事件处理程序,所以它使用如何在Javascript中重新定义“this”?,javascript,jquery,this,Javascript,Jquery,This,我有一个函数,它是JQuery事件处理程序。因为它是一个JQuery事件处理程序,所以它使用this变量来引用调用它的对象(这对于该库是正常的) 不幸的是,此时我需要手动调用该方法。我如何使被调用函数中的这个像从JQuery调用一样工作 示例代码: function performAjaxRequest() { //Function which builds AJAX request in terms of "this" } function buildForm(dialogOfFor
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!
}
}
}
如果对话框
是需要设置为此
的对象,则:
performAjaxRequest.apply(dialog, []);
// arguments (instead of []) might be even better
我们应该做到这一点
否则,在jQuery中,您可以简单地调用要设置为this
例如,假设您希望按钮上发生单击
事件,并且需要它立即发生。简单地说:
$("#my_button").trigger("click");
您的#my_按钮
的单击
处理程序将被调用,此
将被设置为#my_按钮
元素
如果您需要使用不同的调用方法,请使用此。。。例如,如果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);
请参阅:您可以使用函数的调用
方法
someFunction.call(objectToBeThis, argument1, argument2, andSoOnAndSoOn);
你在找
functionRef.apply( objectContext, arguments);
使用闭包
i、 e在早期将此分配给该对象;然后你可以用它做你喜欢的事
var that = this;
正如人们所说,你当然应该学会掌握call()
和apply()
,但一个小帮手是不会伤害你的
在jQuery中,有一个。在纯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 );
如果你不滥用它,它是一个可靠的工具,永远不会失去“this”的范围。假设我没有一个方便的引用来引用事件将被触发的实际事件或元素。@Billy。。。那么您想在一个可变对象或一组对象上触发一个可变事件?如果是这样,一般代码是什么样子的?你现在知道什么你想触发你需要触发的东西吗?只是更新了这个问题——让我知道这是否让它更清楚。问题是,如何重新定义“这个”。您没有回答问题。bind
、call
和apply
在运行时将函数范围内的所有设置为任意对象。这显然是OP所说的“重新定义”。。。当你说“重新定义”这个答案没有解决(所以我可以更新它使它更清楚)是什么意思?第一个答案+1回答了我提出的最直接的问题。选中@Sean的答案只是因为它更完整。+1--也是一个很好的答案,尽管@Chuck的答案更直接地满足了我的要求。请看我的示例代码。请注意,eventfunction是从两个位置调用的。您建议如何在不复制performAjaxRequest
内容的情况下使用闭包来解决这个问题?对不起,我提供的原始函数包含一个心理陷阱。它已更新到正确的版本。