2015-09-29 2 views
1

Если я передаю функцию в качестве аргумента, а функция является методом jQuery, вызовет переданную функцию позже, по-прежнему правильно установленную this? Я думал, что это произойдет, но вызов функции позже будет this = Window.Передача метода для последующей оценки

Пример кода:

var $input = $('input').first(); 

var evaluators = []; 

evaluators.push($input.val); 

_.forEach(evaluators, function(valueMethod) { 
    return valueMethod() //returns undefined always since this = window 
}). 
+0

Вы имеете в виду '$ input.val'? – Stryner

+0

Да. Исправлено. –

ответ

3

Попробуйте использовать bind:

Метод

связывания() создает новую функцию, которая, при вызове, имеет это его ключевое слово, установленное на условии значения, с заданная последовательность аргументов, предшествующих любому, предоставленному при вызове новой функции.

evaluators.push($input.val.bind($input)); 

Стоит отметить bind является not supported on older browsers (например, IE8 и FF3 (или старше)).

+0

Это то, что я ожидал сделать. Означает ли это, что JS устанавливает это «правильно», если вы вызываете функцию непосредственно из экземпляра объекта, например 'obj.prototypeMethod()'? –

+0

Вы правы, я добавил ссылку на таблицу совместимости – mbinette

+0

Это правильно. В принципе, то, что означает 'input.val', - это сама функция, без ее контекста (например, метод прототипа). Контекст передается при выполнении вызова. Что «bind» делает, так это создать новую функцию, которая обертывает исходную, определяя контекст, переданный как параметр. – mbinette

0

Обратитесь к jQuery.proxy(), чтобы узнать, как может быть задан контекст или this.

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