Какова область действия переменной, определенной в функциональном выражении в строгом режиме?

Как я понимаю, когда переменная определена, она привязывается к «ближайшей» локальной области через this.

Если область не задана локально, ближайшая область действия становится window.

Однако в строгом режиме для локальной области устанавливается значение undefined вместо window, как часть спецификации ECMAscript 5, предназначенной для ограничения неправильного использования глобальной области.


Использование шаблона выражения немедленно вызываемой функции и строгого режима для создание плагина jQuery

;( function( $, window ){
   "use strict";
   var myScope = this;
   var myVar = 1;

   var myFunction = function(){
     console.log( myScope, myVar );
   } 

   $.myFunc = myFunction;

})( jQuery, window );

локальная область (контекст) не создается (через вызов функции) и, таким образом, устанавливается в значение undefined.

Если локальная область не определена, а window.myVar не определена, какова область действия переменной myVar и как получить к ней доступ?


person qodeninja    schedule 19.01.2013    source источник


Ответы (2)


this context variable не имеет ничего общего с Scope с точки зрения того, как ECMAscript реализует Lexical scope внизу.

this всегда будет ссылаться на объект вызова, который может измениться во время выполнения, в то время как область/контекст не может измениться. У вас есть два вызова функций, каждый из которых имеет свой собственный Контекст выполнения и свой собственный Объект активации соответственно Запись лексического окружения, которые используются реализация для хранения любых локальных данных, таких как формальные параметры, переменные и объявления функций.


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

var myScope = { };  // respectively Object.create( null );

В строгом режиме реализация просто установит this в undefined для любой функции, которая была вызвана как есть. Это означает, что значение this определяется тем, как вызывается функция. В вашем случае это самовыполняющаяся функция, и, следовательно, ее this всегда будет undefined в строгом режиме и window (глобальный) в не строгом режиме.

person jAndy    schedule 19.01.2013
comment
Я спрашиваю, каков контекст объекта myVar. Я думаю, поскольку они просто решили не устанавливать его в окно, ответ точно не определен. Я думал, что присвоение значения переменной подразумевает наличие некоторого контекста, к которому у меня должен быть доступ, и если это не this или window, то это должно быть что-то. - person qodeninja; 19.01.2013
comment
@qdeninja: точно. Это по-прежнему зависит от того, как вызывается функция, но в вашем случае значение this всегда будет содержать undefined в строгом режиме. - person jAndy; 19.01.2013
comment
@qodeninja: ваш тот же код без «use strict» также не будет назначать переменную окну, но базовый контекст не меняется между двумя ситуациями. Другими словами, без strict вы все равно не сможете выполнить window.myVar или myScope.myVar. - person Jim Deville; 19.01.2013
comment
@JimDeville: конечно, он бы! Без строгого режима this будет просто ссылкой на window (если я вас правильно понял). Он не сможет получить доступ к переменной myVar извне, но он, конечно, сможет получить доступ ко всему, что он записал в глобальный объект через эту ссылку. - person jAndy; 19.01.2013
comment
@jAndy: но, поскольку он находится в области модуля, а myVar объявлен с var, он не будет отображаться на this. IOW, вы все еще не можете сделать myScope.myVar или window.myVar - person Jim Deville; 19.01.2013
comment
@JimDeville: о... нет, я понял. Да, вы правы с этим, конечно. Я имел в виду, что в нестрогом режиме он мог бы делать то же самое, что и myVar.foo = 42;, и мог бы получить доступ к window.foo из любого места, поскольку оба ссылаются на глобальный объект. - person jAndy; 19.01.2013
comment
ах, да (при условии, что вы имели в виду myScope, а не myvar в этом комментарии), в этом мы согласны. - person Jim Deville; 19.01.2013

myVar относится к содержащему закрытию. Когда я запускаю ваш код, а затем запускаю $.myFunc(), вывод будет undefined 1, так как myVar все еще присутствует в этом замыкании. Однако нет никакого способа получить доступ к myVar снаружи замыкания. Это тот же механизм, который используется для реализации приватных переменных в JS.

То, что говорит @jAndy, также верно, this не связано с областью действия, и в этом случае this анонимной функции равно undefined

person Jim Deville    schedule 19.01.2013