据我了解,当定义变量时,它会通过this
附加到“最近的”本地范围。
如果未在本地设置范围,则最近的范围变为window
。
但是,在严格模式中,本地范围设置为未定义,而不是window
,as part of the ECMAscript 5 spec designed to limit misuse of the global scope.
使用immediately invoked function expression pattern和严格模式创建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
的范围是什么以及如何访问它?
答案 0 :(得分:2)
根据ECMAscript如何在下面实现词法范围,this context variable
与范围没有任何关系。
this
将始终引用调用对象,它可以在运行时更改,而范围 / 上下文无法改变。你有两个函数调用,每个都有自己的执行上下文和它自己的激活对象分别是 Lexical Environment Record ,它们被存储任何本地数据的实现,如正式参数,变量和函数声明。
您实际上要在这里实现的是创建一个哈希 / 名称空间对象,它用作容纳数据的容器。因此,您不应分配this
,而只需创建自己的对象。
var myScope = { }; // respectively Object.create( null );
在严格模式中,对于任何已按调用的函数,实现只会将this
设置为undefined
。这意味着,this
的值取决于如何函数被调用。在您的情况下,它是一个自动执行的函数,因此,this
在严格模式和undefined
中始终为window
(全局)在非严格模式。
答案 1 :(得分:1)
myVar
的范围限定为包含闭包。当我运行你的代码,然后运行$ .myFunc()时,输出为undefined 1
,因为myVar
仍然存在于该闭包中。但是,无法从闭包之外访问myVar
。这与用于在JS中实现私有变量的机制相同。
@jAndy所说的也是如此,this
与范围无关,在这种情况下,匿名函数的this
为undefined