Какво не е.
this
не е текущият обхват. this
не е указател към текущата функция. Това са популярни погрешни схващания.
Какво е това
Когато се извика функция, JavaScript определя какво this
ще бъде вътре в тази функция. За да разберете това, погледнете къде е извикана функцията. След това преминете през белодробното „никога не яжте незаконни наркотици“, за да разберете какво ще бъде this
въз основа на този сайт за обаждания:
Никога
N означава „ново“ обвързване.
Извикването на функцията беше ли продължено от новата ключова дума (напр. new Foo()
)? Ако е така, JavaScript ще създаде нов, празен обект (т.е. { }
) и ще го зададе като стойност на this
.
Яжте
E означава „изрично“ обвързване.
Беше ли извикана функцията с bind()
, call()
или apply()
? Ако е така, JavaScript ще зададе първия аргумент, предаден на тези функции, като стойността на this
. Например foo.call(bar)
изрично задава стойността на this
в рамките на foo
до bar
.
Незаконен
I означава „имплицитно“ обвързване.
Беше ли извикана функцията като препратка към свойство на обект? Ако е така, JavaScript задава стойността на this
на този обект. Например:
obj = { a: '1', foo: function() { return this.a } }; obj.foo() // 1
Наркотици
D означава „обвързване по подразбиране“.
Нито едно от другите три правила не се прилага, т.е. голо извикване на функция (напр. foo()
)? Ако е така, JavaScript задава по подразбиране стойността на this
за глобалния обхват, който е window
в браузъра. В строг режим JavaScript вместо това задава стойността от this
на undefined
.