JavaScript'这'在不同的背景下

JavaScript 'this' in different context

本文关键字:背景 JavaScript      更新时间:2023-09-26

我正在尝试创建一个JavaScript对象,如下所示。

var MyObject = function (parameters) {
    this.parameters = parameters;
    parameters.userFunction(this.MyObjectCallback);
}
MyObject.SOME_STATIC_VARIABLE = 21;
MyObject.prototype = {
    myObjectCallback: function() {
         console.log(this);
    }
}

MyObject对象将接受一个userFunction,它将向该userFunction传递一个处理程序。用户函数将执行一些逻辑并将结果传递回实例,例如:

new MyObject({userFunction: function(callback) {
   $.post(
        'http://localhost/~knyttl/source.php',
        {},
        callback,
        'json');,
}});

不幸的是,即使正确地调用了callbackthis也会得到JQuery对象的实例,而不是我想要的MyObject实例。总之,我无法保留MyObject实例。

我甚至不确定这是否是创建JavaScript对象的正确方法。如有任何建议,我将不胜感激。

您可以使用.bind绑定特定的this值。我还纠正了My的大写。

parameters.userFunction(this.myObjectCallback.bind(this));

当您调用类似a.b()的函数时,请在b内部调用this === a。但是,如果而不是直接调用它,而是只传递函数(如a.b)并稍后调用它,则此绑定将丢失。

.bind返回一个新函数,该函数现在接收作为this的jQuery ajax结果。然而,它忽略了这一点,并使用预定义的(绑定的)this调用myObjectCallback

.bind在较旧的浏览器上不可用,但有垫片可用。

请参阅apply()和call()。

parameters.userFunction.call(this, this.MyObjectCallback);

jQuery允许您设置回调的上下文

你处于一个奇怪的境地,你的设计伤害了你。您的MyObject不能作为上下文传入,因为它是在同一时间创建的。

new MyObject({userFunction: function(callback) {
   $.post(
        'http://localhost/~knyttl/source.php',
        {},
        callback,
        'json');,
}});

因此:

var myObj = new MyObejct();
myObj.setCallback({userFunction: function (callback) {
     $.ajax({
         context: myObj,
         url: 'http://localhost/what ever /',
         success: callback,
         dataType: 'json',
         data: {}
     }
});

试试这个。

            var myObject = {
                obj1:function(paremeters){
                    this.Name = paremeters
                    return this},
                };

我建议你阅读,http://javascript.crockford.com/javascript.html

在javascript中使用这个可能会非常令人困惑。当函数被调用时,它被分配给点后面的值,例如

window.doSomething();

将导致设置为窗口,而

myDOMElement.onClick();

将导致设置为myDOMElement。

在您的案例中,它归结为JQuery的内部工作方式,因此请查看这组非常全面的解释,以了解JQuery是如何处理this的。