1

据我了解,当一个变量被定义时,它会通过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 );

本地范围(上下文)未创建(通过函数调用),因此设置为未定义。

如果本地作用域是未定义且未window.myVar定义的,那么变量的作用域是什么myVar,如何访问它?

4

2 回答 2

2

Scopethis context variable没有任何关系,就 ECMAscript 如何在下面实现词法作用域而言。

this将始终引用invocation 的对象,该对象可以在运行时更改,而范围/上下文不能更改。那里有两个函数调用,每个函数调用都有自己的Execution Context和自己的Activation Object ,分别是Lexical Environment Record,实现用于存储任何本地数据,如正式参数、变量和函数声明


您在这里实际上想要实现的是创建一个哈希/命名空间对象,该对象用作保存数据的容器。因此,您不应该分配this,而只是创建自己的Object

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

严格模式下,实现将只设置this按原样undefined调用的任何函数。这意味着, 的值取决于函数的调用方式。在您的情况下,它是一个自动执行的功能,因此,它将始终处于严格模式,并且(全局)处于非严格模式thisthisundefinedwindow

于 2013-01-19T19:25:26.380 回答
1

myVar范围为包含闭包。当我运行您的代码,然后运行 ​​$.myFunc() 时,输出为undefined 1,因为myVar该闭包中仍然存在。然而,没有办法myVar从封闭的外部进入。这与用于在 JS 中实现私有变量的机制相同。

@jAndy 所说的也是正确的,this与范围无关,在这种情况下this,匿名函数的undefined

于 2013-01-19T19:32:41.507 回答