Имеет ли смысл использовать .apply () и передавать тот же экземпляр, что и контекст? - PullRequest
2 голосов
/ 29 ноября 2011

Я читаю веб-приложения Javascript от О'Рейли. В различных местах книги автор использует что-то из следующего:

instance.init.apply(instance, arguments);

Имеет ли это какой-то смысл? Разве это не то же самое, что:

instance.init(arguments);

.call () и .apply () используются для ручной установки контекста выполнения функции. Зачем мне их использовать, если я все равно собираюсь использовать исходный контекст выполнения?

Ответы [ 2 ]

3 голосов
/ 29 ноября 2011

Дело в том, что arguments является массивоподобным объектом.Doing ...

instance.init(arguments);

... передает один аргумент, который является массивоподобным объектом, содержащим определенные аргументы.С другой стороны, выполнение ...

instance.init.apply(instance, arguments);

... передаст массивоподобный объект в качестве отдельных аргументов .Это правда, что настройка instance является бесполезной, потому что вы уже написали ее, но если вы используете .apply, вам просто нужно также установить значение this.

Быстрый пример различия

function log(a, b, c) {
    console.log(a, b, c);
}

function log2() {
    log.apply(null, arguments); // `this` value is not meaningful here,
                                // it's about `arguments`
}

function log3() {
    log(arguments);
}

log(1, 2, 3);  // logs:  1, 2, 3

log2(1, 2, 3); // logs:  1, 2, 3

log3(1, 2, 3); // logs:  <Arguments>, undefined, undefined
               //        where <Arguments> contains the values 1, 2, 3
0 голосов
/ 29 ноября 2011

Использование apply () в этом примере гарантирует, что 'this' === instance, а не DOMWindow, если instance.init () выполняется из другой функции / выражения.

var x = function(){ debugger; },
    y = function(){ x.apply(x, arguments); },
    z = function() { x(arguments); };

y("abc", true, []); // this === x
z("abc", true, []); // this === DOMWindow

Это просто указание контекста.

...