Как использовать метод вызова javascript в jQuery? - PullRequest
1 голос
/ 18 января 2012

Можно ли использовать call method javascript (как описано в [документации 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 ]

5 голосов
/ 18 января 2012

Вам не нужно call (или apply)

Вы должны сделать это вместо этого:

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

Javascript имеет лексическую область видимости, что означает, что переменная that доступен для вашего обратного вызова и имеет значение, где он определен.В этом случае that определяется как this во внешней области видимости.

3 голосов
/ 18 января 2012

Не так, потому что вы не перезваниваете.Он вызывается изнутри.

Вы можете использовать .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));

...where первый аргумент - ваша функция, а второй аргумент - значение, которое вы хотите использовать для this в обратном вызове.

2 голосов
/ 18 января 2012

Да, вы можете .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 ) );
1 голос
/ 18 января 2012
var self = this;
$('#image_id').load(function(){
    (function(){
        console.log(this);
    }).call(self);
});
...