【问题标题】:ES6 for of statement error even when compiled with babel即使使用 babel 编译,ES6 for of 语句也会出错
【发布时间】:2018-05-01 09:42:33
【问题描述】:

我在弄清楚这句话有什么问题时遇到了一些问题。

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,通过 browserify 和 babelify 使用 gulp 编译所有最新版本。如果我安装 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;
    }

但这给了我另一个 safari 错误:

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

【问题讨论】:

标签: javascript ecmascript-6 babeljs


【解决方案1】:

要遍历 NodeList ,NodeList 需要有一个 Symbol.iterator 属性,但 babel 不会 polyfill DOM,只有 JS。

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

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

【讨论】:

  • 我很惊讶 Safari 仍然不支持这个,一个简单干净的循环类的方法几乎是我想使用 jQuery 的唯一原因。在这种情况下,什么是 for of 的最佳替代方案?
  • @chris 只需添加 polyfill。 NodeList[Symbol.iterator] = [][Symbol.iterator]; 并且有效。
  • 我使用 babel-polyfill 完成了这项工作,然后使用了 corejs 更小更灵活的 polyfill。我现在正在等待下一期突然出现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-28
  • 1970-01-01
  • 1970-01-01
  • 2011-10-04
  • 2013-12-22
  • 1970-01-01
  • 2020-04-07
相关资源
最近更新 更多