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 );