即使用babel编译,ES6也会出现语句错误

时间:2018-05-01 09:42:34

标签: javascript ecmascript-6 babeljs babel

我在解决这个陈述的错误时遇到了一些问题。

for(const form of doc.getElementsByClassName('class-name')) { .... }

查看compatibility listings,我可以看到为什么在safari上运行普通ES6时出现问题,因为它没有支持。然而,直到我用babel编译ES6时才会发生这种情况。

编译时,我得到以下内容:

var _iteratorNormalCompletion3 = true;
    var _didIteratorError3 = false;
    var _iteratorError3 = undefined;

    try {
        for (var _iterator3 = doc.getElementsByClassName('class-name')[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
            var form = _step3.value;
        }
    } catch (err) {
        _didIteratorError3 = true;
        _iteratorError3 = err;
    } finally {
        try {
            if (!_iteratorNormalCompletion3 && _iterator3.return) {
                _iterator3.return();
            }
        } finally {
            if (_didIteratorError3) {
                throw _iteratorError3;
            }
        }
    }

但这会在safari中触发错误

TypeError: doc.getElementsByClassName('class-name')[Symbol.iterator] is not a function. (In 'doc.getElementsByClassName('class-name')[Symbol.iterator]()', 'doc.getElementsByClassName('class-name')[Symbol.iterator]' is undefined)

这是使用最新版本的Babel,通过浏览器编译吞下并通过babelify所有最新版本。如果我安装transform-es2015-for-of插件并强制它,我会得到以下结果:

var _loop = function _loop() { };

    for (var _iterator2 = doc.getElementsByClassName('class-name'), _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {
        var _ref2;

        var _ret = _loop();

        if (_ret === 'break') break;
    }

但是这给了我另一个旅行错误:

TypeError: _iterator2[Symbol.iterator] is not a function. (In '_iterator2[Symbol.iterator]()', '_iterator2[Symbol.iterator]' is undefined)

1 个答案:

答案 0 :(得分:2)

要遍历NodeList,NodeList需要具有Symbol.iterator属性,但是babel不会对DOM进行填充,只有JS。

我建议不要完全使用for of,或者使用除了babel之外的HTML5 DOM polyfill来使其工作。

https://github.com/babel/babel/issues/545