What is a -> operator in C or C++?

Kurér JavaScript-fejl i Internet Explorer

10/02/2010

Rating: 3.96 (6781 votes)

Oplever du, at din JavaScript-kode, som fungerer perfekt i moderne browsere som Chrome og Firefox, pludselig viser uforklarlige symptomer i Internet Explorer? En almindelig diagnose for dette problem er en syntaksfejl, der peger på et mystisk '=>' symbol. Dette er ikke en fejl i din kode, men snarere et symptom på en fundamental inkompatibilitet. Tænk på Internet Explorer som en ældre patient, der ikke kan tåle den nyeste medicin. I denne artikel vil vi diagnosticere problemet, forstå hvorfor det opstår, og vigtigst af alt, give dig de recepter og behandlinger, der er nødvendige for at helbrede din kode og sikre dens sundhed på tværs af alle browsere, selv de ældste.

Does IE11 support arrow notation for anonymous functions?
This code causing the issue in above statement d=> (d.part=="primary"? -40: 40) IE11 does not support the arrow notation for anonymous functions. Rewrite it as function (d) { return d.part == "primary" ? -40 : 40; }. @Phylogenesis: Not all arrow functions are anonymous. This one isn't, for instance: var f = () => "foo"; ^^ ... or the docs.
Indholdsfortegnelse

Diagnosen: Hvad er Pilfunktioner?

Før vi kan ordinere en behandling, må vi forstå sygdommen. Det '=>' symbol, du ser, er kernen i det, der kaldes Pilfunktioner (Arrow Functions). Dette er en moderne funktion, der blev introduceret i en større opdatering til JavaScript kendt som ECMAScript 2015 (eller ES6). Pilfunktioner tilbyder en mere kortfattet og ren måde at skrive funktioner på. Lad os se på et klassisk eksempel:

En traditionel anonym funktion i JavaScript (ES5) ser sådan ud:

var addition = function(a, b) { return a + b; };

Med en pilfunktion kan den samme logik skrives meget mere kompakt:

const addition = (a, b) => a + b;

Fordelene er tydelige: færre tegn, ingen grund til at skrive `function`-nøgleordet, og en implicit `return` for simple udtryk. De har også en vigtig teknisk fordel ved, hvordan de håndterer `this`-konteksten, hvilket løser mange hovedpiner for udviklere. De er en fantastisk forbedring af sproget – en slags mirakelkur for kodens læsbarhed og funktionalitet.

Patienten: Internet Explorer 11's Tilstand

Nu til vores patient: Internet Explorer 11 (IE11). Problemet er simpelt: IE11 blev udgivet i 2013. JavaScript-standarden ES6, som introducerede pilfunktioner, blev først færdiggjort i 2015. Microsoft stoppede med at udvikle nye funktioner til Internet Explorer, før disse moderne JavaScript-funktioner blev standard. Derfor forstår IE11's JavaScript-motor simpelthen ikke, hvad `=>` betyder. For den er det en ukendt og ugyldig syntaks, hvilket resulterer i den syntaksfejl, du oplever.

Kort sagt: Internet Explorer 11 har absolut ingen understøttelse for ES6 pilfunktioner. Der er ingen skjult indstilling eller magisk trick til at aktivere det. Browseren er for gammel og forstår ikke det moderne sprog.

Recept #1: Den Manuelle Behandling (Omskrivning til ES5)

Den mest direkte og enkle kur er at oversætte din moderne kode til det ældre sprog, som Internet Explorer forstår. Dette svarer til at knuse en pille og blande den i vand, så en ældre patient kan indtage den. Du skal manuelt omskrive dine pilfunktioner til traditionelle, anonyme funktioner. Lad os tage de to eksempler, du gav, og helbrede dem.

Eksempel 1: Prisformatering

Din moderne kode, der fejler i IE:

price = price.replace(/(.*)\./, x => x.replace(/\./g,'') + '.')

For at gøre dette kompatibelt med IE11, omskriver vi pilfunktionen `x => ...` til `function(x) { return ... }`:

price = price.replace(/(.*)\./, function(x) { return x.replace(/\./g, '') + '.'; });

Koden gør nu præcis det samme, men den er skrevet i en syntaks, som IE11 kan genkende og udføre uden fejl.

Eksempel 2: D3.js Visualisering

Din moderne D3.js-kode, der fejler i IE:

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"));

Her bruger du flere pilfunktioner. Hver enkelt skal oversættes. Behandlingen ser således ud:

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

Selvom koden bliver længere, er resultatet, at din visualisering nu vil blive vist korrekt i IE11, fordi den ikke længere støder på den ukendte `=>` syntaks.

Recept #2: Den Automatiske Behandling (Brug af en Transpiler)

Manuel omskrivning fungerer fint for små projekter, men det kan hurtigt blive en uoverskuelig opgave i større applikationer. Forestil dig at skulle finde og erstatte hundredvis af pilfunktioner manuelt. Her kommer en mere avanceret og kraftfuld behandling ind i billedet: en transpiler.

En transpiler er et værktøj, der automatisk omskriver din moderne JavaScript-kode (ES6+) til ældre, bredt kompatibel JavaScript-kode (ES5). Den mest populære transpiler til dette formål er Babel. Tænk på Babel som en digital farmaceut: Du giver den din moderne recept (din ES6-kode), og den blander en medicin (ES5-kode), som selv den ældste patient (IE11) kan tåle.

At sætte Babel op er en del af en moderne webudviklingsproces og involverer typisk værktøjer som Node.js, npm og en bundler som Webpack eller Rollup. Selvom opsætningen kræver en indledende indsats, er fordelene enorme:

  • Automatisk Konvertering: Du kan skrive moderne, ren og effektiv kode uden at bekymre dig om browser-kompatibilitet.
  • Fremtidssikring: Babel kan konvertere ikke kun pilfunktioner, men også mange andre moderne funktioner som `let`, `const`, `classes`, `async/await` osv.
  • Effektivitet: Det sparer dig for utallige timer med manuel debugging og omskrivning.

For de fleste professionelle projekter, der kræver IE11-support, er brugen af en transpiler som Babel den anbefalede standardbehandling for at sikre kodens kompatibilitet.

Sammenligning af Funktionstyper

For at give et klart overblik, er her en tabel, der sammenligner de to tilgange.

EgenskabPilfunktion (ES6)Traditionel Funktion (ES5)IE11 Kompatibilitet
SyntaksKortfattet og ren (`() => {}`)Længere (`function() {}`)Afhænger af typen
`this`-bindingArver `this` fra den omgivende kontekstHar sin egen `this`-kontekstAfhænger af typen
LæsbarhedHøj for simple operationerKan være mere tydelig for komplekse funktionerAfhænger af typen
UnderstøttelseModerne browsereAlle browsereFuldt understøttet

Ofte Stillede Spørgsmål (FAQ)

Hvorfor skal jeg overhovedet understøtte Internet Explorer i dag?

Selvom IE's globale markedsandel er meget lille, er der stadig scenarier, hvor support er nødvendig. Dette gælder især i store virksomheder eller offentlige institutioner, hvor ældre interne systemer er bygget til IE. Det er afgørende at kende din målgruppe. Hvis analyser viser, at en betydelig del af dine brugere stadig anvender IE11, er det nødvendigt at sikre en funktionel oplevelse for dem.

Er der andre moderne JavaScript-funktioner, der ikke virker i IE11?

Ja, absolut. Listen er lang. Udover pilfunktioner mangler IE11 understøttelse for nøglefunktioner som `let` og `const` (variabelerklæringer), `Promises` (til asynkron kode), `async/await`, `Classes`, `template literals` (``), og mange flere. En transpiler som Babel er den bedste kur mod alle disse kompatibilitetsproblemer på én gang.

Kan jeg ikke bare detektere IE og vise en advarsel?

Det er en mulig strategi. Du kan bruge JavaScript til at identificere brugerens browser, og hvis det er Internet Explorer, kan du vise en meddelelse, der anbefaler dem at skifte til en moderne browser. Dette er dog ofte en dårlig brugeroplevelse og løser ikke det underliggende problem for de brugere, der ikke har mulighed for at skifte (f.eks. på en arbejdscomputer).

Konklusion: En Sund Kodebase for Alle

At støde på en syntaksfejl i Internet Explorer på grund af pilfunktioner er ikke et tegn på, at du har gjort noget forkert. Tværtimod er det et tegn på, at du bruger moderne, effektive værktøjer. Problemet ligger hos den forældede browser, der ikke længere kan følge med udviklingen.

Heldigvis er der effektive behandlinger. For hurtige, små rettelser kan du manuelt omskrive din kode til den universelt forståelige ES5-syntaks. For en langsigtet, robust og professionel løsning er implementeringen af en transpiler som Babel den bedste medicin. Ved at gøre dette sikrer du, at din applikation er sund, stærk og tilgængelig for alle brugere, uanset hvor gammel deres browser måtte være.

Hvis du vil læse andre artikler, der ligner Kurér JavaScript-fejl i Internet Explorer, kan du besøge kategorien Teknologi.

Go up