在严格模式下在函数表达式中定义的变量的范围是什么?

时间:2013-01-19 19:20:20

标签: javascript scope function-expression

据我了解,当定义变量时,它会通过this附加到“最近的”本地范围。

如果未在本地设置范围,则最近的范围变为window

但是,在严格模式中,本地范围设置为未定义,而不是windowas 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的范围是什么以及如何访问它?

2 个答案:

答案 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与范围无关,在这种情况下,匿名函数的thisundefined