Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Javascript中重新定义“this”?_Javascript_Jquery_This - Fatal编程技术网

如何在Javascript中重新定义“this”?

如何在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

我有一个函数,它是JQuery事件处理程序。因为它是一个JQuery事件处理程序,所以它使用
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
内容的情况下使用闭包来解决这个问题?对不起,我提供的原始函数包含一个心理陷阱。它已更新到正确的版本。