jQuery: добавить функцию self в массив? - PullRequest
0 голосов
/ 16 января 2012

Учитывая функцию, вот так:

var allev = new Array();
function events(index) {
    allev[index] = $(this); // doesn't work
}

Есть ли способ заставить это работать описанным выше способом, или я всегда ограничен:

var allev = new Array();
function events(index) {
    // ...
}

function() { // out of scope, so make objects global
    var count = allev.length;
    var inst = events(count);
    allev[count] = inst;
}

Если есть какие-либо варианты ставок, кроме двух выше, я тоже открыт для них.

Ответы [ 2 ]

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

Когда вы вызываете функции (в отличие от методов) в JavaScript, this является глобальным объектом или undefined в строгом режиме. Поэтому использование this, как у вас выше, никогда не сработает.

Вы могли бы сделать это:

function events(index) {
    arr[index] = arguments.callee;
    alert("Hi");
}

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

Вы также можете сделать это:

function events(index) {
    allev[index] = this; // will work if you call with apply or call
}

Если и только если, вы когда-либо звоните events так:

events.call(events, 12);

call и apply позволяют указать, что this будет равно внутри вызова функции. Разница в том, что call ожидает, что все аргументы будут перечислены, в то время как apply ожидает, что все аргументы будут переданы в массиве. Таким образом, приведенное выше будет эквивалентно

events.apply(events, [12]);

DEMO

0 голосов
/ 16 января 2012

Я решил немного подробнее изучить API jQuery и нашел $. Proxy . Он делает именно то, что я хочу, не имея метода передачи самого себя, чтобы заставить this работать должным образом.

allev[index] = $.proxy(function() { return this; }, this);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...