如何在使用strict mode pragma时声明全局变量

joh*_*der 32 javascript

使用自调用函数来包装严格模式兼容代码(通常称为严格模式编译指示)被认为是一种好习惯:

(function(){
  "use strict";
  // Strict code here
}());
Run Code Online (Sandbox Code Playgroud)

我的问题是如何在这种情况下声明全局变量?我今天知道的三种选择:

备选方案1:

var GLOB = {};

(function(){
  "use strict";
}());
Run Code Online (Sandbox Code Playgroud)

备选方案2:

(function(){
  "use strict";
  window.GLOB = {};
}());
Run Code Online (Sandbox Code Playgroud)

备选方案3:

(function(win){
  "use strict";
  win.GLOB = {};
}(window));
Run Code Online (Sandbox Code Playgroud)

任何偏好和动机?其他选择?

小智 55

IMO备选方案3是最好的.但它假设window代表全局范围 - 这对于浏览器而言是正确的,但对于其他JS环境(命令行,Node.js等)则不然.

以下内容将全面运作:

(function(globals){
  "use strict";
  globals.GLOB = {};
}(this));
Run Code Online (Sandbox Code Playgroud)


Ada*_*sko 10

我知道这是一个古老的问题,但有一个没有提到获得全球背景的方法:

(function(globals){
  "use strict";
  globals.GLOB = {};
}( (1,eval)('this') ));
Run Code Online (Sandbox Code Playgroud)

(1,eval)('this')

this将从全局上下文进行评估,因此您可以将其粘贴到您喜欢的任何地方,并且您将始终获得全局上下文


Rob*_*b W 1

如果将方法 1 粘贴到另一个函数中,方法 1 将会失败。

使用方法 3,可以更轻松地将方法导出到另一个命名空间。只需替换window为,例如,frames[0]document就足以将所有方法附加到自定义命名空间。

出于最后一个原因,我推荐方法 3。