Как работает 'call' в javascript? - PullRequest
       9

Как работает 'call' в javascript?

9 голосов
/ 01 сентября 2011

У меня есть вопрос о 'call' в javascript.

var humanWithHand = function(){
    this.raiseHand = function(){
        alert("raise hand");
    }
}

var humanWithFoot = function(){
    this.raiseFoot = function(){
        alert("raise foot");
    }
}

var human = function(){

    humanWithHand.call( this );
    humanWithFoot.call( this );

}

var test = new human();

так что ... когда я использую 'call' как humanWithHand.call (this), что происходит внутри?

копирует ли переменная humanWithH (или указывает?) Свои свойства и элементы в прототип человеческой переменной?

Ответы [ 2 ]

9 голосов
/ 01 сентября 2011

Иегуда Кац имеет хорошую запись метода JavaScript Function#call.Его рецензия должна ответить на ваш вопрос, а также множество дополнительных вопросов.

Когда вы вызываете функцию напрямую, используя общий синтаксис:

var foo = function() {
  console.log("foo");
  return this;
};
foo(); // evaluates to `window`

Тогда this внутри вызова функции - что угодноthis находится вне вызова функции.По умолчанию в браузере this вне вызовов любой функции - window.Таким образом, внутри вызова функции, как указано выше, this также по умолчанию window.

Когда вы вызываете функцию с использованием синтаксиса вызова метода:

var bar = {
  foo: function() {
    console.log("foo");
    return this;
  }
};
bar.foo(); // evaluates to `bar`

Затем thisвнутри вызова функции находится объект слева от самого правого периода: в этом случае bar.

Мы можем смоделировать эту ситуацию, используя call.

Когда вы устанавливаетеФункция вне объекта, и вы хотите вызвать ее с помощью this внутри вызова функции, установленного для объекта, вы можете:

var foo = function() {
  console.log("foo");
  return this;
}
var bar = { };
foo.call(bar); // evaluates to `bar`

Вы также можете использовать эту технику для передачи аргументов:

var foo = function(arg1, arg2) {
  console.log("foo");
  return arg1 + arg2;
}
var bar = { };
foo.call(bar, "abc", "xyz"); // evaluates to `"abcxyz"`
8 голосов
/ 01 сентября 2011

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

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

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