#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 /