Какова область действия переменной, определенной в выражении функции в строгом режиме?
Как я понимаю, когда переменная определена, она подключается к "ближайшей" локальной области видимости через 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