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

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

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

В строгом режиме, однако, локальная область видимости устанавливается как неопределенная вместо 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 );

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

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

2 ответа

Решение

this context variable не имеет никакого отношения к Scope, с точки зрения того, как ECMAscript реализует лексическую область видимости.

this всегда будет ссылаться на объект вызова, который может измениться во время выполнения, тогда как область действия / контекст не могут быть изменены. Там у вас есть два вызова функций, каждый из которых имеет свой собственный контекст выполнения и собственный объект активации, соответственно, Lexical Environment Record, которые используются реализацией для хранения любых локальных данных, таких как формальные параметры, переменные и объявления функций.


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

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

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

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

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

Другие вопросы по тегам