Прежде всего, следует сказать, что это указание не может быть определена при определении функции. Только когда функция выполнена, может это то, кто эта точка. На самом деле, это в конечном итоге указывает на объект, который его называет (в этом предложении есть некоторые проблемы, и мы объясним, почему возникают проблемы позже. Хотя большинство статей в Интернете говорят это, хотя не будет никаких проблем в понимании этого во многих случаях, на самом деле неточно понять это, поэтому вы чувствуете, что не можете понять это, когда понимаете это). Тогда я подробно расскажу о этой проблеме.
Зачем узнать это? Если вы изучили функциональное программирование и объектно-ориентированное программирование, вы должны знать, что делать. Если вы не узнали об этом, вам не нужно читать эту статью на данный момент. Конечно, если вы заинтересованы, вы также можете прочитать это. В конце концов, это то, что должно быть освоено в JS.
Пример 1:
функция a () {var user = "Little J"; console.log (this.user); // неопределенная консоль.log (это); // окно} a ();Согласно тому, что мы сказали выше, это в конечном итоге указывает на объект, который его называет. Функция A здесь фактически указывает объектом Window, и следующий код может доказать это.
функция a () {var user = "Little J"; console.log (this.user); // неопределенная консоль.log (это); } window.a () // windowКак и приведенный выше код, оповещение на самом деле является свойством окна, и это также указывает на окно.
Пример 2:
var o = {user: "Погоня за мечты", fn: function () {console.log (this.user); // Погоня от снов}} o.fn ();Это указывает на объект O, потому что вы называете это FN и выполняете его через o.fn (), поэтому естественным указанием является объект o. Я хотел бы еще раз подчеркнуть, что это указание не может быть решено при создании функции, и это может быть решено только при ее вызвании. Тот, кто это называет, будет на кого укажет, вы должны выяснить это.
На самом деле, пример 1 и пример 2 недостаточно точны. Следующий пример может отменить вышеуказанную теорию.
Если вы хотите полностью понять это, вы должны посмотреть на следующие несколько примеров.
Пример 3:
var o = {user: "Catching Dreams", fn: function () {console.log (this.user); // Поймать мечты}} window.o.fn ();Этот код почти такой же, как приведенный выше код, но почему это указывает на окно? Если вы следите за вышеуказанной теорией, этот момент к объекту, который его называет. Позвольте мне сказать что -нибудь еще здесь. Windows - это глобальный объект в JS. Переменная, которую мы создаем, на самом деле добавляет атрибуты в окно, поэтому вы можете использовать окно для указания объекта o здесь.
Я не объясню, почему этот код выше не указывает на окно. Давайте посмотрим на другой код.
var o = {a: 10, b: {a: 12, fn: function () {console.log (this.a); // 12}}} obfn ();Это также указывает на объект O, но это не выполняет его, так что вы обязательно скажете, что то, что я сказал в начале, все неправильно? На самом деле, это не так, просто это было неточно в начале. Далее я добавлю одно предложение. Я считаю, что вы можете полностью понять проблему, на которую указывает.
===========================================================================
Случай 1 : Если это в функции, но он не вызывается объектом на предыдущем уровне, то это указывает на окно. Здесь нужно объяснить, что в строгой версии JS это указывает на окно, но мы не будем обсуждать проблему строгой версии здесь. Если вы хотите знать, вы можете искать в Интернете самостоятельно.
===========================================================================
Случай 2 : Если это есть в функции, и эта функция вызывается объектом на предыдущем уровне, то это указывает на объект на предыдущем уровне.
===========================================================================
Случай 3: Если это в функции, эта функция содержит несколько объектов. Хотя эта функция вызывается самым внешним объектом, это указывает только на объект на следующем уровне. Пример 3 может доказать, что если вы не верите в это, тогда давайте продолжим смотреть на несколько примеров.
var o = {a: 10, b: {// a: 12, fn: function () {console.log (this.a); // не определен}}} obfn ();Хотя в объекте B нет атрибута A, это также указывает на объект B, потому что это будет указывать только на его предыдущий объект, независимо от того, есть ли что -то, что это хочет в этом объекте.
Есть еще один особый случай, пример 4:
var o = {a: 10, b: {a: 12, fn: function () {console.log (this.a); // неопределенная консоль.log (это); // window}}} var J = obfn; j ();Это окно здесь, разве это не смущено? На самом деле, это потому, что вы не понимаете предложение, что также имеет решающее значение.
Это всегда указывает на объект, который называет его последним, что означает, кто называет его, когда он выполняется. В примере 4, хотя функция Fn ссылается на объект B, она не выполняется при назначении FN переменной j, поэтому в конечном итоге он указывает на окно, что отличается от примера 3. Пример 3 непосредственно выполняет Fn.
Это на самом деле только это, но указание будет отличаться в разных обстоятельствах. Приведенное выше резюме является небольшой ошибкой в каждом месте, и нельзя сказать, что это ошибка, но ситуация будет отличаться в разных средах, поэтому я не могу объяснить это ясно одновременно, так что вы можете испытывать только медленно.
Версия конструктора это:
function fn () {this.user = "small j";} var a = new fn (); console.log (a.user); // маленький jПричина, по которой объект А может указать на пользователя в функции FN здесь, заключается в том, что новое ключевое слово может изменить направление этого и указывать на это на объект A. Почему я говорю, что это объект? Потому что использование нового ключевого слова - это создание экземпляра объекта. Понимая это предложение, вы можете подумать о нашем примере. В настоящее время он просто создан и не выполнен. Призыв к этой функции Fn является объектом A, так что это естественно объект A. Так почему же пользователь в объекте FN? Потому что вы скопировали функцию FN в объект A, а использование нового ключевого слова эквивалентно копированию копии.
В дополнение к вышесказанному, мы также можем изменить направление этого самим собой ================= >>> позвонить, применить, привязать
Обновите небольшую проблему, когда эти встречи возвращаются
функция fn () {this.user = 'small j'; возвращаться {}; } var a = new Fn; Console.log (A.User); //неопределенныйПосмотрите на другого
функция fn () {this.user = 'small j'; return function () {};} var a = new fn; Console.log (A.User); //неопределенныйПриходи снова
функция fn () {this.user = 'small j'; вернуть 1;} var a = new Fn; Console.log (A.User); // небольшая jfunction fn () {this.user = 'small j'; вернуть неопределенные;} var a = new Fn; Console.log (A.User); // маленький jЕсли возвратное значение является объектом, то это указывает на возвращенный объект. Если возвратное значение не является объектом, то это все еще указывает на экземпляр функции.
функция fn () {this.user = 'small j'; вернуть неопределенные;} var a = new Fn; console.log (a); // fn {user: "small j"}Другой момент заключается в том, что, хотя NULL также является объектом, это все еще указывает на экземпляр этой функции здесь, потому что NULL более особенный.
функция fn () {this.user = 'small j'; return null;} var a = new fn; Console.log (A.User); // маленький jДополнительные моменты знаний:
1. По умолчанию это в строгой версии больше не окно, но не определен.
2. Новый оператор изменит задачу на указании функции. Хотя мы объяснили это выше, мы не обсуждали эту проблему подробно. Это редко упоминается в Интернете, поэтому необходимо поговорить об этом здесь.
функция fn () {this.num = 1;} var a = new fn (); console.log (a.num); // 1Почему это указывает на? Во -первых, новое ключевое слово создаст пустой объект, а затем метод применения функции будет автоматически вызвать, чтобы указать на это на этот пустой объект. Таким образом, эта функция будет заменена этим пустым объектом.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.