为什么这个箭头函数在 IE 11 中不起作用?

IT技术 javascript internet-explorer
2021-02-04 07:54:23

下面的代码在 IE 11 中不起作用,它会在控制台中引发语法错误

g.selectAll(".mainBars")
    .append("text")
    .attr("x", d => (d.part == "primary" ? -40 : 40))
    .attr("y", d => +6)
    .text(d => d.key)
    .attr("text-anchor", d => (d.part == "primary" ? "end" : "start"));

使用d3.js二部图进行可视化

此代码导致上述语句中的问题 d=>(d.part=="primary"? -40: 40)

5个回答

您正在使用箭头函数。IE11 不支持它们。改用function函数。

这是Babel对 ES5翻译:

g.selectAll(".mainBars").append("text").attr("x", function (d) {
  return d.part == "primary" ? -40 : 40;
}).attr("y", function (d) {
  return +6;
}).text(function (d) {
  return d.key;
}).attr("text-anchor", function (d) {
  return d.part == "primary" ? "end" : "start";
});

由于没有任何代码使用this,您不必担心保留箭头函数的this行为(因为传统函数this通过它们的调用方式获得它们,但箭头函数会关闭 this)。但是,如果代码确实使用了this并且您希望它的行为类似于箭头函数,那么您将需要使用通常的技术

为了澄清@ user1742529的评论,箭头功能会自动绑定this地方function(){...}没有。在像 VueJS 这样的系统中,它会导致问题。 function(){...}.bind(this)更类似于箭头函数。
2021-03-11 07:54:23
不要忘记thisvar f = (a) => {a.some1(); this.some2();};var f = function(a) {a.some1(); this.some2();}.bind(this);
2021-03-24 07:54:23
@user1742529 & Nathan - 问题中的代码都this没有使用,因此无需做任何事情来保留它。但是我加了一段。
2021-03-26 07:54:23

如果您需要支持 IE 11,请避免使用箭头函数,因为它不受支持

将它们更改为常规函数,您的代码应该可以按预期工作

g.selectAll(".mainBars").append("text").attr("x",function(d) { 
  return d.part=="primary"? -40: 40;
}).attr("y",function(d){
  return +6;
}).text(function(d) { 
  return d.key;
}).attr("text-anchor", function(d) { 
  return d.part=="primary"? "end": "start";
});

一般来说,在箭头函数成为箭头函数之前,它们是常规的 JS function所以对于 IE11,我们只需要及时退后一步

var fruits=["apple","banana","orange"];

var modernResult=fruits.find(e => e.includes("nana"));
console.log(modernResult);

var IEresult=fruits.find(function(e){return e.includes("nana")});
console.log(IEresult);

这段代码根本不像问题中的代码(并且“不要使用箭头函数”没有说明其他所有答案都没有说过)
2021-03-12 07:54:23
是的,但是这个问题是“箭头函数在 IE 中不起作用”的第一个搜索结果,我给出了一个简单且不太具体(更一般)的解释。但我理解这是违反规则的,抱歉。
2021-03-25 07:54:23

IE 目前不支持箭头符号,但有一种方便快捷的方法可以将ES6代码转换ES5.1IE. 访问Babel网站,然后将您的代码粘贴到左侧框中并复制已转换为早期版本的JavaScript.

例如,您的代码被转换为:

"use strict";

g.selectAll(".mainBars").append("text").attr("x", function (d) {
   return d.part == "primary" ? -40 : 40;
}).attr("y", function (d) {
   return +6;
}).text(function (d) {
   return d.key;
}).attr("text-anchor", function (d) {
   return d.part == "primary" ? "end" : "start";
});

Internet Explorer(IE) 根本不支持 ES6 功能,但你可以安装BabelJS但是您也可以改为编写 vanillaJS 函数。

例如:

const hasBrownEyes = eye.color === "brown" ? true : false

或者只是 vanilla.js:

var hasBrownEyes = false; // default answer, it will be overwritten if it has a brown eye

if (eye.color === "brown") {
    return true;
}