Javascript:是"这个"在案件中有用还是必要?

时间:2015-04-16 05:09:40

标签: javascript

查看一些遗留代码并查看它。函数体是在纯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”。我是对的吗?

由于

4 个答案:

答案 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的概念,因此上面的构造是唯一可靠的方法来获取对默认命名空间/范围对象的引用。