Причина использования метода JS .call ()? - PullRequest
57 голосов
/ 25 января 2012

Мне интересно, с чем связано использование метода call () в JS.Кажется, он дублирует обычный метод вызова this.

Например, у меня есть код с вызовом ().

var obj = {
    objType: "Dog"
}

f = function(did_what, what) {
    alert(this.objType + " " + did_what + " " + what);
}

f.call(obj, "ate", "food");

Вывод «Собака съела еду».Но тот же результат я могу получить, назначив функцию для объекта.

var obj = {
    objType: "Dog"
}

f = function(did_what, what) {
    alert(this.objType + " " + did_what + " " + what);
}

obj.a = f;
obj.a("ate", "food");

Результат тот же.Но этот способ более понятен и удобен в использовании.Зачем нужен call ()?

Ответы [ 4 ]

61 голосов
/ 25 января 2012

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

F.ex, он также позволяет вам вызывать служебные методы вне области действия, как при использовании «частных» функций:

var obj = (function() {
    var privateFn = function() {
        alert(this.id);
    }
    return {
        id: 123,
        publicFn: function() {
            privateFn.call(this);
        }
    };
}());

obj.publicFn();

В приведенном выше примере privateFn не отображается в obj, но его все равно можно создать так, как если бы он был частью общедоступной области (используя this аналогичным образом).

39 голосов
/ 18 июня 2015

2017 Обновление

Все функции с помощью Function.prototype имеют метод .call.Причина использования .call() состоит в том, чтобы указать, на что ссылается переменная "this".

MDN указывает:

Метод call() вызывает функцию с даннымэто значение и аргументы предоставляются индивидуально.

Рассмотрим следующее:

function x() {
    return this;
}

x()

В строгом режиме x() возвращает undefined, в нестрогом режиме возвращает глобальный объект, Window в контексте браузера.

Пример с .call() мы говорим ему, что означает "this":

function x() {
    return this;
}

var obj = {
    myName      : 'Robert',
    myLocation  : 'Earth'
}

x.call(obj);

Результат: {myName: "Robert", myLocation: "Earth"}.В приведенном выше примере мы указываем объект obj в качестве значения this внутри функции x()

. Он может использоваться для эмуляции наследования в ООП.

Пример:

var Robert = {
    name: "Robert Rocha",
    age: 12,
    height: "5,1",
    sex: "male",
    describe: function() {
        return "This is me " + this.name + " " + this.age + " " + this.height + " " + this.sex;
    }
};

Допустим, что приведенное выше является главным объектом (прототипом), и вы хотите наследовать функцию describe в другом объекте:

var Richard = {
    name: "Richard Sash",
    age: 25,
    height: "6,4",
    sex: "male",
}

Объект Richard не имеетесть функция description, и вы хотите просто унаследовать, так сказать, функцию.Вы бы сделали это так:

console.log( Robert.describe.call( Richard ) );

Вывод: This is me Richard Sash 25 6,4 male

6 голосов
/ 25 января 2012

Вероятно, вы использовали бы второй способ в вашем примере, но иногда вы хотите использовать функции одного объекта для другого объекта.Примером может быть использование Array методов для объектов, подобных массиву, таких как NodeList s

var el = document.getElementById("foo");
[].forEach.call(el.children, function(child, index) {
    //Iterate over an element's children, performing an action on each one
});
3 голосов
/ 25 января 2012

Это связано с концепцией функции первого класса . В основном языки, такие как Javascript, позволяют вам рассматривать функции как свои собственные права. Функции могут храниться в переменных или передаваться другим функциям.

call() предоставляет способ выполнить функцию стояния без привязки к какому-либо другому объекту.

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