查看一些遗留代码并查看它。函数体是在纯Javascript中完成的,不使用任何第三方库。
有人可以在(function() { })(this)
中阐明“ this ”的用法吗?
完整代码:
(function() {
var root = this;
var SOMEVAR;
SOMEVAR = root.SOMEVAR = {};
SOMEVAR.windowOffset = 0;
SOMEVAR.defaultBase = 195;
SOMEVAR.resizeIFrame = function(){
// some codes
};
SOMEVAR.resetIFrameSize = function(height) {
// some codes
}
window.SOMEVAR = SOMEVAR;
})(this);
在我提出问题之前,我实际上已经阅读了所有“这个”相关的用法。我只是找不到这种用法适合我读过的那些。不知何故,我不认为这里的“this”甚至不是必需的,因为所有代码都需要创建“SOMEVAR”并将其绑定到“window”。我是对的吗?
由于
答案 0 :(得分:0)
您正在定义匿名函数,然后立即使用this
参数调用它。
如果您只想了解this
的含义,请参阅this其他问题。
答案 1 :(得分:0)
这是Immediately-Invoked Function Expression (IIFE)的一个有点奇怪的例子。第一部分:
(function(){})
只是定义一个函数(外部括号是不必要的)。然后调用此函数,将this
作为参数传递。通常会实际声明一个参数,然后对函数内的参数执行某些操作:
(function(context) {
// do something to or with context
})(this);
this
实际引用的对象取决于此代码的执行位置以及严格模式是否有效。有关详细信息,请参阅the docs for this
。
答案 2 :(得分:0)
啊,什么是this
。 javascript书中最古老的问题。一般来说,this
指的是当前代码正在执行的上下文。如果您在脚本标记中直接运行“顶级”代码,则它引用window
。在点击事件?当前元素。在构造函数中?将要构造的对象。你甚至可以通过电话和申请来制作它。
答案 3 :(得分:0)
如果你看到这个结构:
(function(ns) { })(this);
不在其他函数内部,然后this
是脚本执行的默认命名空间的引用。在浏览器中,默认名称空间具有非常奇怪的名称window
,因此以下内容将输出true
:
(function(ns) {
console.log( ns === window );
})(this);
当您需要在命名空间中检查变量存在时,此类ns(名称空间)变量很有用。例如:
alert(foo);
会出现错误"未定义的变量foo",但是这个:
(function(ns) {
alert(ns.foo);
})(this);
将显示警告,其中包含" undefined"。
另一种用法是在模块中,可以像在node.js中一样在浏览器内部工作。 Node.js没有window
的概念,因此上面的构造是唯一可靠的方法来获取对默认命名空间/范围对象的引用。