Почему я не могу использовать .call () в функции замены? - PullRequest
2 голосов
/ 10 февраля 2011

Почему это действительно:

function func(a,b,c) {
    console.log(this, a,b,c);
    return '';
}
'testing'.replace(/e/, func);

но это не так:

function func(a,b,c) {
    console.log(this, a,b,c);
    return '';
}
'testing'.replace(/e/, func.call);

если func является ссылкой на функцию, а вызов является ссылкой на функцию, не должны ли они оба работать?

Вот скрипка этого

Ответы [ 2 ]

6 голосов
/ 10 февраля 2011

Поскольку при передаче функции call вы выводите ее из контекста func, поэтому внутри call ключевое слово this будет ссылаться на window вместо func.

window не является функцией, но call ожидает, что this будет функцией, поэтому она ломается.

Для сравнения.

var AnObject = {
    call: function () { console.log("this.location is: ", this.location); },
    location: "This string is the location property of AnObject"
};

AnObject.call();
setTimeout(AnObject.call, 500);
1 голос
/ 10 февраля 2011

Потому что .call() сам по себе является методом, но не тот, который полезен для replace().

Другими словами, в то время как вы намерены передать func, вы фактически передаете совершенно другую функцию (call), которая служит цели, бесполезной в качестве аргумента для .replace().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...