2012-01-18 5 views
1

Возможно ли использовать javascript call method (как описано в [документации mdn]) , чтобы передать аргумент this?Как использовать метод вызова javascript в jQuery?

Имея, например, этот код:

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); 
}); 

Но это не работает.

Благодарим вас за любое предложение.

ответ

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 в обратном вызове.

+0

Спасибо, что они оба отлично работают! Так вы думаете, что второй будет работать даже со старыми браузерами? Просто примечание: во втором вы забыли точку после загрузки Это может быть $ ('# image_id'). Load ($. Proxy (function() { –

+0

Ваше второе решение отлично работает во всех случаях, которые я тестировал, даже со старыми браузерами, планшетами и тяжелыми кодами. Не то же самое для 'bind'. Возможно, потому, что это слишком недавно. –

+0

@LucaBorrione: Да, собственный' .bind' не будет работать в старых браузерах, но jQuery ' $ .proxy' предназначен для работы в тех, кто старше. Спасибо за то, что вы нападаете на бродячие '.'. Я удалю его. :) –

5

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

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

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

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

+0

Я знал об этом, я хотел бы упомянуть его. Я искал способ использовать 'this' внутри' load function', как это делает bind. Я должен уточнить это лучше.В любом случае, спасибо за ваш вопрос, по крайней мере, он всегда отлично работает в любой ситуации. –

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)); 
+0

Ваш первый пример тоже очень интересен. спасибо В основном ваш ответ то же самое, что я не являюсь одним из них, я проверил это только потому, что нашел его первое решение более ясным, но это только мой собственный вкус. Еще раз спасибо –

+0

@LucaBorrione в основном вы можете просто прямо передать ab ound console log вместо того, чтобы создавать функцию-оболочку, которая просто вызывает console.log. Но это работает только в том случае, если вы просто хотите называть одну функцию в обработчике: P – Esailija

+0

Я не уверен, поймал ли я вас, так или иначе, моя функция была всего лишь примером. –

1
var self = this; 
$('#image_id').load(function(){ 
    (function(){ 
     console.log(this); 
    }).call(self); 
}); 
+0

Здравствуйте, это очень интересное решение с точки зрения синтаксиса. Просто примечание: вы забыли '.call' после' load' он должен быть '$ ('# image_id'). Load (function() {' ... Слабая точка - это то, что вам нужно определить 'self' снаружи. вы не можете использовать '}). call (this);' .. так что в основном это то же самое, что и использование непосредственно 'self' внутри' load function' как шоу 'hvgotcodes'. Решение с использованием 'bind' выполняется быстрее и проще. В любом случае, спасибо за это. –

+0

@ Luca Borrione: Спасибо, что заметили ошибку. Что касается решения, я согласен с тем, что с помощью 'bind' у вас есть более чистое и понятное решение, но вы должны иметь в виду, что это недавнее дополнение к ecmascript, поэтому оно может быть недоступно во всех браузерах (см. Здесь см. доступность этой функции: http://kangax.github.com/es5-compat-table/). Мое решение может быть лучше в некоторых сценариях, поскольку ему не нужно изменять фактический код в обработчике; таким образом, вы можете использовать один и тот же обработчик в разных контекстах без необходимости переписывать ссылки на контекст. –

+0

Вы совершенно правы :) –

 Смежные вопросы

  • Нет связанных вопросов^_^