При вызове функции в JavaScript, «это» будет относиться к разным вещам в зависимости от контекста:
Если функция была связана, то «это» будет установлен в любой это был связан, например fn.bind(x)()
Если вы вызвали функцию с помощью fn.call(x)
или fn.apply(x)
, то это будет установлено значение х.
Если функция была определена с помощью стрелки обозначения, то this
будет то, что было определено как this
, когда функция была определена .
При вызове функции с thing.fn()
, то this
это то, что перед «», в этом случае „вещь“.
Если вы находитесь в конструкторе, вызванном new
, то this
ссылается на новый объект под строительство.
Если вы просто вызов голой функции, то есть не на какой-либо объект, , который не связан, что не является функция стрелки и вы вызываете его в простом способе, без использования вызовите или примените, то this
будет ссылаться на глобальный объект, если вы не находитесь в строгом режиме, и не определен, если вы находитесь в строгом режиме. Это то, что называется как «это принуждение» по цитате.
Вот почему, если вы откроете консоль браузера и введите
Function('console.log(this)')()
консоль будет выводить окно, которое является глобальным объектом в браузере. Однако, если вы открываете консоль и введите
Function('"use strict";console.log(this)')()
консоль будет регистрировать undefined
.
Здесь я использую конструктор Function, потому что это способ принудительного использования нестрогого режима, независимо от ситуации, в которой он появляется, - поэтому эти примеры должны работать, даже если вы запускаете их изнутри файла или консоль, работающая в строгом режиме.
this
принуждение может быть наиболее удобным способом получения глобального объекта, то есть
const global = Function('return this')()
работает и в браузере и узле, даже в строгом режиме.
Но большую часть времени вы хотите быстро выйти из строя, и функции, которые вы ожидаете использовать для определенных типов экземпляров, фактически работающих на вашем глобальном объекте, могут сильно испортить ситуацию. Попытка написать что-нибудь или прочитать что-нибудь из this
исключений броска, когда он не определен, почти всегда лучше, чем чтение и запись на глобальный объект.
Что вы уже знаете о Javascript's 'this'? (Будет ли объяснение основано на том, что «это» используется в общем смысле, или ...?) – nnnnnn
Текст, который вы цитируете, объясняет, что означает «это принуждение» (в этом контексте). Что именно вы не понимаете? Описание не очень точное: * «В строгом режиме, ссылаясь на a, это значение null или undefined вызывает ошибку». * Это не так, конечно. Доступ к 'this' сам по себе не приведет к ошибке. 'this.something' будет. –
Эта [ссылка] (http://stackoverflow.com/a/11496488/452708) может бросить некоторые идеи. – Abhijeet