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

Javascript 在严格模式下,函数表达式中定义的变量的范围是什么?,javascript,scope,function-expression,Javascript,Scope,Function Expression,据我所知,当定义变量时,它会通过this附加到“最近的”局部范围 如果本地未设置范围,则最近的范围将变为窗口 但是,在严格模式下,本地范围设置为未定义,而不是窗口 使用and和strict模式创建jQuery插件 ;( function( $, window ){ "use strict"; var myScope = this; var myVar = 1; var myFunction = function(){ console.log( myScope

据我所知,当定义变量时,它会通过
this
附加到“最近的”局部范围

如果本地未设置范围,则最近的范围将变为
窗口

但是,在严格模式下,本地范围设置为未定义,而不是
窗口


使用and和strict模式创建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
的作用域是什么?如何访问它?

就ECMAscript如何在下面实现词法范围而言,
此上下文变量与作用域无关

将始终引用调用对象,调用对象在运行时可能会更改,但范围/上下文不能更改。这里有两个函数调用,每个函数调用都有自己的执行上下文和激活对象,分别是词汇环境记录,实现使用它们来存储任何本地数据,如形式参数、变量和函数声明


实际上,您在这里试图实现的是创建一个散列/名称空间对象,作为保存数据的容器。因此,您不应该分配
这个
,而应该创建自己的对象


在严格模式下,对于任何按原样开票的函数,实现只需将
设置为
未定义
。这意味着,
this
的值取决于调用函数的方式。在您的情况下,它是一个自动执行的函数,因此,它的
在严格模式下,此
将始终是
未定义的
,在非严格模式下,此
窗口
(全局)将始终是
未定义的。

myVar
的范围是包含的闭包。当我运行代码,然后运行$.myFunc()时,输出是
undefined 1
,因为
myVar
仍然存在于该闭包中。但是,无法从闭包外部访问
myVar
。这与在JS中实现私有变量所使用的机制相同


@jAndy所说的也是正确的,
这个
与作用域无关,在这种情况下,匿名函数的
这个
未定义的

我要问的是myVar的对象上下文是什么。我想,既然他们只是决定不把它设为窗口,答案就是,没有定义。我认为给变量赋值意味着我应该访问某个上下文,如果它不是
this
window
,那么它应该是某种东西。@qodeninja:没错。这仍然取决于函数的调用方式,但在您的情况下,
this
值在严格模式下始终包含
undefined
。@qodeninja:没有“use strict”的相同代码也不会将变量分配给窗口,但在这两种情况下,基础上下文不会改变。换句话说,如果不严格,你仍然不能做
window.myVar
myScope.myVar
@JimDeville:他当然会!如果没有严格模式,
将只是对
窗口的引用(如果我没记错的话)。他将无法从“外部”访问变量
myVar
,但他当然可以通过该引用访问他写入全局对象的任何内容。@jAndy:但由于它是模块作用域,并且
myVar
是用
var
声明的,因此它不会在
上公开。现在,您仍然无法执行
myScope.myVar
window.myVar
var myScope = { };  // respectively Object.create( null );