Автор оригинала: Shubham Dixit.
(This) в JavaScript не является ни ссылкой на саму функцию, и не относитсяна не относительно лексической области функции (лексическая область в JavaScript означает, что переменная, определенная вне функции, может быть доступна внутри другой функции, определенной после объявления переменной , Но наоборот не соответствует действительности; переменные, определенные внутри функции, не будут доступны вне этой функции).
Это на самом деле связывание, которое сделано при функции Призывает и то, что это ссылки определяются полностью по Call-сайт где функция называется (не там, где функция объявлена).
function foo() { console.log(this.a); } var a=2;
В приведенной выше функции привязка по умолчанию для это применяется к функциональному вызову и так очкам это на глобальном объекте.
Переменная, объявленная в глобальном объеме в качестве VAR, являются синонимическими свойствами глобальных объектов одинакового имени
function foo() { "use strict"; console.log(this.a); } var a=2; foo(); //Type Error this is undefined
В строгом режиме глобальный объект не подходит для привязки по умолчанию, поэтому это вместо этого установлено значение undefined.
Неявное обязательство
function foo() { console.log(this.a); } var obj={ a:2, foo:foo }
В приведенной выше функции Foo на самом деле является свойством объекта, поэтому это неявно связан с объектом
Неявно потерян
function foo() { console.log(this.a) } var obj={ a:2, foo:foo } var bar=obj.foo; //function reference alias var a="oops ,global"; bar() ;// oops, global
Поскольку сайт вызова функции – это то, что на самом деле определяет, что будет это Указывать на то, что на вызове сайта A – «Ой, глобальные», так что это то, что на самом деле напечатано на консоли.
Используя обратные вызовы
function foo() { console.log(this.a); } function doFoo(fn) { fn()//-->call site } var obj={ a:2, foo:foo } var a="oops global"; doFoo(obj.foo); // oops global
Обратный вызов – это другая функция, передаваемая как аргумент для некоторой функции, поэтому в обратном вызове значение этого будет ссылаться на сайт, в котором этот обратный вызов называется, то есть родительская функция, на которой функция (обратный вызов) передается как аргумент.
Явная связывание
function foo() { console.log(this.a); } var obj={ a:2 } foo.call(obj) //2 --> giving explicit binding as we are directly stating what the this to be
Функция .prototype.Call () Метод вызывает функцию с данным это Значение и аргументы обеспечиваются индивидуально.
Это для функций со стрелками, FAT Arrow Функции
function foo() { return (a)=>{ // this here is lexically inherited from foo() console.log(this.a); }; } var obj1={ a:2 } var obj2={ a:3 } var bar=foo.call(obj1); bar.call(obj2);// 2 not 3
Функция стрелки, созданная в FOO () LEXICE PALTURES ЧТОБЫ БЫТЬ FOO () S, находящаяся в его времени вызова .since foo () Была ли это связана с OBJ1, BAR (ссылка на возвращенную функцию стрелки также будет этой связанной с OBJ1)
Ссылка – даешь не знать JS
Спасибо за прочтение .