1

是否可以使用call methodjavascript(如 [mdn 文档] 中所述)来传递参数this

有例如这个代码:

console.log(this);
$('#image_id').load(function () {
    console.log(this);
});

我希望第二个this(包含在 中的那个load function)与第一个相同。

我试过了

console.log(this);
$('#image_id').load.call(this, function () {
    console.log(this);
});

但它不起作用。

提前感谢大家的任何建议。

4

4 回答 4

5

你不需要call(或apply

你应该这样做:

var that = this;
console.log(this);
$('#image_id').load( function () { 
    console.log(that); 
});

Javascript 具有词法范围,这意味着该变量that可用于您的回调,并且具有定义它的位置的值。在这种情况下,that被定义为this在外部范围内。

于 2012-01-18T14:23:37.890 回答
3

不是那样的,因为你没有调用回调。它在内部被调用。

你可以用.bind

console.log(this);
$('#image_id').load( function () {
    console.log(this);
}.bind(this));

但它在旧版浏览器中不可用。(这是原生.bind()的,不是 jQuery 的。)


jQuery 有一些可以工作的东西,叫做$.proxy...

console.log(this);
$('#image_id').load($.proxy(function () {
    console.log(this);
},this));

...其中第一个参数是您的函数,第二个参数是您要this在回调中使用的值。

于 2012-01-18T14:24:37.660 回答
2

是的,您可以.call使用任何 jQuerys 函数,但这只会影响该函数。您传递的函数是一个单独的回调函数,this由 jQuery 控制。

您可以使用$.proxy强制回调的上下文。

$('#image_id').bind( "load", $.proxy( console.log, console, this ) );

如果您想做的不仅仅是记录,它会变得更加丑陋:

$('#image_id').bind( "load", $.proxy( function(){
     console.log( this );
     alert( this );
}, this ) );
于 2012-01-18T14:26:04.377 回答
1
var self = this;
$('#image_id').load(function(){
    (function(){
        console.log(this);
    }).call(self);
});
于 2012-01-18T14:27:11.413 回答