使用自调用函数来包装严格模式兼容代码(通常称为严格模式编译指示)被认为是一种好习惯:
(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)
任何偏好和动机?其他选择?
我最近一直在玩node.js而且我遇到了关于this模块全局范围内使用的奇怪行为.
this 绑定到全局范围中的module.exports:
console.log(this === exports); // -> true
Run Code Online (Sandbox Code Playgroud)
但是this在方法范围内绑定到全局:
(function() { console.log(this === global); })(); // -> true
Run Code Online (Sandbox Code Playgroud)
这也导致了这种令人困惑的行为:
this.Foo = "Weird";
console.log(Foo); // -> throws undefined
(function() { this.Bar = "Weird"; })();
console.log(Bar); // -> "Weird"
Run Code Online (Sandbox Code Playgroud)
我想解决方案是永远不要this在全局范围内使用并明确使用extends或global替代,但是这背后是否存在逻辑,或者它是node.js中的错误或限制?
IIFE需要访问非重写window对象 - 可以看作:
像(jQuery示例):
$(function (global) {
// do something with global
})( window );
Run Code Online (Sandbox Code Playgroud)
但有时我也看到这个(underscore.js):
(function() {
var global= this;
// do something with global
}).call(this);
Run Code Online (Sandbox Code Playgroud)
问题1:有什么区别吗?如果是这样,我应该何时使用?
问题2:this里面IIFE 是 window.为什么有必要"发送" window/ call(this)?(jQuery没有使用严格模式imho)
NB
看起来jQuery(从1.11.0开始)也采用了这种模式:
(function (global, factory)
{
//....
}(typeof window !== "undefined" ? window : this, function (window, noGlobal)
{
//...
});
Run Code Online (Sandbox Code Playgroud) 我一直在玩,eval并注意到它可以评估Chrome,Firefox和Opera中的非字符串:
eval(Array) === Array; // true
eval(this) === this; // true
eval(4 * 3 / 2) === 6; // true
Run Code Online (Sandbox Code Playgroud)
这是标准行为吗?是否记录在任何地方?我找不到eval除了字符串参数之外的任何其他内容.
如果这不是标准行为,有人可以识别出不起作用的主机环境吗?