2015-06-22 32 views
0

AirBnb Javascript Style Guide建议模块下面的代码模式:函数(全局){...}(this)如何工作?

// fancyInput/fancyInput.js 

!function(global) { 
    'use strict'; 

    var previousFancyInput = global.FancyInput; 

    function FancyInput(options) { 
     this.options = options || {}; 
    } 

    FancyInput.noConflict = function noConflict() { 
     global.FancyInput = previousFancyInput; 
     return FancyInput; 
    }; 

    global.FancyInput = FancyInput; 
}(this); 

但是,一旦你比如运行:

FancyInput({a: 1, b: 2}); 

控制台上显示这个错误“遗漏的类型错误:无法设置的未定义的属性‘选项’” 。

我想明白为什么这里面的FancyInput函数是Window。到目前为止,我可以在开始时扩展这个模块模式。我应该以另一种方式绑定它吗?

+1

难道你不应该用'var x = new FancyInput({...})'调用它吗? –

回答

2

它的要点是全球范围内的this在浏览器中是window。在其他环境中(主要是node.js),它不是window,而是一个不同的全局对象,但在很多方面我们关心它的行为是相同的。

您的代码不工作,因为你需要使用new关键字来实例化结构:

new FancyInput({a: 1, b: 2}); 

这将创建一个新的对象,这样的类方法中this.作品&构造。

+0

谢谢,真的很好的解释 – raulricardo21