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

标签 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 的作用域是什么?如何访问它?

最佳答案

this context variable就 ECMAscript 如何在底层实现词法作用域而言,与作用域没有任何关系。

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


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

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

严格模式中,实现只会设置thisundefined对于任何按原样调用的函数。这意味着 this 的值由如何函数被调用决定。在您的情况下,它是一个自执行函数,因此它是 this永远是undefined严格模式window (全局)非严格模式

关于javascript - 在严格模式下函数表达式中定义的变量的范围是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14417928/

相关文章:

javascript - 所有函数表达式突然不被识别为函数

Javascript 到 wordpress 网站?

javascript - SVG + CSS - 如何包含在 HTML 中以及缩放和颜色?

session - 在coldfusion中,什么范围内的变量可以传递到iframe页面?

javascript - array.filter() 删除函数表达式中的 <falsey> 值,但不删除箭头函数中的值

javascript - 命名和未命名匿名 Javascript 函数之间的区别

javascript - 使用 .hide ('slide' 缓和)?

Javascript: document.getElementById ("el").style.display 返回空字符串,但不是?

javascript - JS局部变量改变全局

c# - ASP.NET + C# 多项目解决方案。我应该在哪里放置我的全局效用函数?