Значение this
в глобальном контексте выполнения относится к глобальному объекту, например ::
.
this === window; // true
Для кода функции это действительно зависит от того, как вы вызываете функцию, например, значение this
неявно устанавливается, когда:
Вызов функции без базового объекта ссылка :
myFunc();
Значение this
также будет ссылаться на глобальный объект.
Вызов функции, связанной как свойство объекта :
obj.method();
Значение this
будет относиться к obj
.
Использование оператора new
:
new MyFunc();
Значение this
будет ссылаться на вновь созданный объект, который наследуется от MyFunc.prototype
.
Кроме того, вы можете явно установить это значение при вызове функции, используя методы call
или apply
, например:
function test(arg) {
alert(this + arg);
}
test.call("Hello", " world!"); // will alert "Hello World!"
Разница между call
и apply
заключается в том, что с apply
вы можете правильно передать любое количество аргументов, используя массив или arguments
объект, например ::
function sum() {
var result = 0;
for (var i = 0; i < arguments.length; i++) {
result += arguments[i];
}
return result;
}
var args = [1,2,3,4];
sum.apply(null, args); // 10
// equivalent to call
sum(1,2,3,4); // 10
Если значение первого аргумента call
или apply
равно null
или undefined
, значение this
будет ссылаться на глобальный объект.
(обратите внимание, что это изменится в будущем, с ECMAScript 5, где call
и apply
передают значение thisArg
без изменений)