javascript - 函数(全局){...}(这个)如何工作?

标签 javascript module

AirBnb Javascript Style Guide建议模块使用以下代码模式:

// 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});

控制台显示此错误“Uncaught TypeError:无法设置未定义的属性“选项””。

我试图理解为什么 FancyInput 函数内部的 this 是 Window。到目前为止,我从一开始就可以扩展这个模块模式。我应该用其他方式绑定(bind)它吗?

最佳答案

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

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

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

它创建一个新对象,以便 this. 在类方法和构造函数中工作。

关于javascript - 函数(全局){...}(这个)如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30989273/

相关文章:

ios - 如何在 Objective C 中创建宏以在运行时执行多个模块?

javascript - 类型 'void' 不可分配给类型 'FormData'

javascript - 使用 Google map 在两组标记之间切换

javascript - 单击时添加/删除类 - 如何在第二次单击区域中删除类?

Haskell:隐藏模块导出中的特定功能?

ruby-on-rails - Ruby -::in 类名

localization - Mathematica 中的词法和动态范围 : Local variables with Module, With 和 Block

node.js - 如何处理 Node.js 中的循环依赖

javascript - 使用 Firebase、React-Native、Redux 进行数据库 .on 调用的约定?

javascript - jQuery 无法从 PHP 脚本读取 JSON 响应