почему id ‘undefined’ в этом коде?

#javascript

#javascript

Вопрос:

Возьмите следующий js, сработает предупреждение, но id ‘undefined’. Кто-нибудь может сказать мне, почему? Как я могу вызвать loadPage с параметром?

 var arr = [];
arr.push(LoadPage);
arr[0].call(5);

function LoadPage(id) {
    alert(id);
}
  

Ответ №1:

Поскольку вы используете .call метод для вызова своей функции, первый передаваемый вами аргумент устанавливает значение this .

Итак, вам нужно было бы сделать это вместо:

 arr[0].call(5); // you're setting the value of "this" in the function to "5"

function LoadPage(id) {
    alert( this );
}
  

Если вам не нужно явно устанавливать значение this , а скорее просто хотите передать аргумент, то исключите .call часть:

 arr[0](5);  // now you're just passing an argument. The value of "this" in the
            //     function will be the "window" object

function LoadPage(id) {
    alert( id );
}
  

РЕДАКТИРОВАТЬ: Чтобы дать краткий обзор того, как this получает свое значение функция, рассмотрим эту функцию, которая будет вызываться несколькими различными способами:

 function some_func() {
    alert( this );  // the value of "this" changes based on how it is called.
}

  // Calling it directly, "this" is the "window" object ( in browsers )
some_func();  // window


  // Calling it from an object's property, "this" will be that object
var some_obj = { foo:'bar', a_func:some_func };
some_obj.a_func();  // the object we used to reference the function


  // Calling it via the `.call` method, "this" will be that first argument
var some_obj = {foo:'bar'};
some_func.call( some_obj );  // the object referenced by some_obj


  // Calling it via the `.apply` method, "this" will be that first argument
var some_obj = {foo:'bar'};
some_func.apply( some_obj );  // the object referenced by some_obj

 // (The difference between `.call` and `.apply` is the manner in which
 //         they accept additional arguments passed to the function.)
  

В более новых браузерах вы можете использовать .bind() для получения копии функции, к которой привязано значение «this».

 var some_obj = {foo:'bar'};
var new_func = some_func.bind( some_obj );

some_func(); // will be window
new_func();  // will be the object that we bound
  

Комментарии:

1. Спасибо, есть ли другой способ вызвать функцию, когда все, что у меня есть, это ссылка на эту функцию (не уверен, что «ссылка» здесь правильный термин)?

2. @John: Просто удалите .call , если вам не нужно явно задавать значение this , например arr[0](5) . Вы почти всегда вызываете функцию по ссылке на нее. Просто значение this внутри функции изменяется в зависимости от того, как вызывается эта функция.

3. @John Ваши 2 варианта используют call() и apply(), которые чрезвычайно похожи, но отличаются только способом обработки аргументов. Оба принимают область / контекст (то, что должно рассматриваться как ‘this’ при вызове метода).

Ответ №2:

Первым аргументом call() является объект, к которому привязано this ключевое слово.

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

 arr[0].call(arr[0], 5);
  

Ответ №3:

Из документов MDC:

 fun.call(thisArg[, arg1[, arg2[, ...]]])
  

Первый переданный вами аргумент — это то, что становится значением «this». Второй параметр является первым реальным параметром.

Ответ №4:

Использование .call() устанавливает значение this в функции. Попробуйте вызвать функцию таким образом:

 arr[0](5);
  

Демонстрация:http://jsfiddle.net/6D8wN /