绕过巴贝尔重新映射ES6"这个"未定义

时间:2015-07-07 22:16:53

标签: javascript browserify ecmascript-6 babeljs

我正在将代码库移动到ES6类。

我还在处理一些遗留的jQuery模块,这些模块附加了init个函数,这些函数是从html调用的。代码的入口点如下所示:

import * as moduleOne from './module_one/module_one';
import * as moduleTwo from './module_two/module_two';
import * as moduleThree from './module_three/module_three';
import * as moduleFour from "./module_four/module_four";

window.initjQuery = (mod) => {
    eval(mod).init()
}

在HTML中:

<script>initjQuery('moduleFour')</script>

这样可以正常调用moduleFour.init()。但我想尽可能避免使用eval。问题是,Babel将this重新映射为undefined,因此我无法执行以下操作:

var _this = this;

window.initjQuery = function(mod) {
   _this[mod].init();
}

有任何想法如何解决这个问题?

1 个答案:

答案 0 :(得分:4)

这些模块名称只是变量(在模块范围内),没有任何对象的属性。请注意,this在模块中是undefined,就像在严格函数中一样。

因此,您需要将这些模块对象放在显式对象上:

import * as moduleOne from './module_one/module_one';
import * as moduleTwo from './module_two/module_two';
import * as moduleThree from './module_three/module_three';
import * as moduleFour from "./module_four/module_four";

const modules = {moduleOne, moduleTwo, moduleThree, moduleFour};
window.initjQuery = (mod) => {
    modules[mod].init()
};