繁体   English   中英

如何在Javascript中重新定义`this`?

[英]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_buttonclick处理程序将被调用,并且this将被设置为#my_button元素。

如果您需要调用一个不同的方法this ......比方说,与this指的是jQuery对象本身,那么你将要使用callapply上的功能。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM