2016-02-28 2 views
6

я прочитал следующее на сайте:JS: Что такое «это» принуждение? С чем это связано?

Use-строги имеет преимущество. Он устраняет этот принуждение. Без строкового режима ссылка на это значение null или undefined - , автоматически принудительная к глобальному. Это может вызвать много головных уборов и вытаскивание ваших волос. В строгом режиме, ссылаясь на a, это значение null или undefined вызывает ошибку.

Что именно это означает? Что нужно делать с строгим отношением к принуждению this?

+2

Что вы уже знаете о Javascript's 'this'? (Будет ли объяснение основано на том, что «это» используется в общем смысле, или ...?) – nnnnnn

+3

Текст, который вы цитируете, объясняет, что означает «это принуждение» (в этом контексте). Что именно вы не понимаете? Описание не очень точное: * «В строгом режиме, ссылаясь на a, это значение null или undefined вызывает ошибку». * Это не так, конечно. Доступ к 'this' сам по себе не приведет к ошибке. 'this.something' будет. –

+0

Эта [ссылка] (http://stackoverflow.com/a/11496488/452708) может бросить некоторые идеи. – Abhijeet

ответ

2

При вызове функции в JavaScript, «это» будет относиться к разным вещам в зависимости от контекста:

  1. Если функция была связана, то «это» будет установлен в любой это был связан, например fn.bind(x)()

  2. Если вы вызвали функцию с помощью fn.call(x) или fn.apply(x), то это будет установлено значение х.

  3. Если функция была определена с помощью стрелки обозначения, то this будет то, что было определено как this, когда функция была определена .

  4. При вызове функции с thing.fn(), то this это то, что перед «», в этом случае „вещь“.

  5. Если вы находитесь в конструкторе, вызванном new, то this ссылается на новый объект под строительство.

  6. Если вы просто вызов голой функции, то есть не на какой-либо объект, , который не связан, что не является функция стрелки и вы вызываете его в простом способе, без использования вызовите или примените, то this будет ссылаться на глобальный объект, если вы не находитесь в строгом режиме, и не определен, если вы находитесь в строгом режиме. Это то, что называется как «это принуждение» по цитате.

Вот почему, если вы откроете консоль браузера и введите

Function('console.log(this)')()

консоль будет выводить окно, которое является глобальным объектом в браузере. Однако, если вы открываете консоль и введите

Function('"use strict";console.log(this)')()

консоль будет регистрировать undefined.

Здесь я использую конструктор Function, потому что это способ принудительного использования нестрогого режима, независимо от ситуации, в которой он появляется, - поэтому эти примеры должны работать, даже если вы запускаете их изнутри файла или консоль, работающая в строгом режиме.

this принуждение может быть наиболее удобным способом получения глобального объекта, то есть

const global = Function('return this')()

работает и в браузере и узле, даже в строгом режиме.

Но большую часть времени вы хотите быстро выйти из строя, и функции, которые вы ожидаете использовать для определенных типов экземпляров, фактически работающих на вашем глобальном объекте, могут сильно испортить ситуацию. Попытка написать что-нибудь или прочитать что-нибудь из this исключений броска, когда он не определен, почти всегда лучше, чем чтение и запись на глобальный объект.

Смежные вопросы