指甲盖凹凸不平是什么原因| 做亲子鉴定需要什么| 保花保果用什么药最好| 五月十三是什么星座| 两个c是什么牌子| 城投公司是干什么的| 清晰是什么意思| 尿管型偏高是什么原因| 胎盘内血池是什么| 心灵手巧什么意思| 小孩容易出汗是什么原因| 梦见订婚是什么意思| 良代表什么生肖| 水瓶座和什么座最配对| 止血芳酸又叫什么名| 胃胀是什么原因引起的| 颈动脉斑块是什么意思| 什么是处方药和非处方药| 利巴韦林是什么药| 口臭喝什么茶效果最好| 缺钠是什么原因造成的| ha什么意思| 夏天像什么| 宫颈那囊是什么| 什么的舞动| 食糜是什么意思| 审美观是什么意思| 鹤顶红是什么| 胃肠外科是看什么病的| 万兽之王是什么动物| ga什么意思| 容易长痣是什么原因| 线索细胞阳性是什么意思| 什么节日吃饺子| 浙江大学什么专业最好| 梦见带小孩是什么意思| 封豕长蛇是什么意思| 80年属什么| 阴虚火旺吃什么好| 奶嚼口是什么| 15朵玫瑰花代表什么意思| 易孕体质是什么意思| 梦到自己怀孕是什么意思| 巨无霸是什么意思| 黑加仑是什么| 什么是树脂材料| 黄酒什么味道| 立flag是什么意思| 牛大力是什么| 葛根粉有什么作用| 吃什么有利于排便| 什么茶对胃好| 付之东流是什么意思| 镇党委副书记是什么级别| 结膜水肿用什么眼药水| 寅时属什么生肖| 5月28日是什么星座| 双向情感障碍是什么| jps是什么意思| 项链折了意味着什么| 鼻梁长痘是什么原因| 左眼跳是什么预兆| 微循环是什么意思| uniqlo是什么牌子| 什么力| 蜂蜜什么时候喝最佳| 毛囊炎吃什么药| 三尖瓣反流什么意思| 育婴员是做什么的| 姨妈疼吃什么止疼药| 歹人是什么意思| 吃什么能减肥| 12月5号是什么星座| 如来藏是什么意思| 女性长期缺维d会带来什么病| 什么中药可以降糖| 天王表属于什么档次| 女人吃什么提高性激素| 六七年属什么生肖| 幽门螺旋杆菌有什么危害| 诗经是什么朝代的| 斑鸠吃什么| 强直性脊柱炎是什么病| 怂恿是什么意思| 鲜黄花菜含有什么毒素| pbg是什么意思| 树脂是什么材料| 豆种翡翠属于什么档次| 女人左眼跳是什么意思| 醪糟发酸是什么原因| 夜间盗汗是什么原因| 女人梦见蛇是什么预兆| 小便少是什么原因| 减肥期间吃什么最好| 虎的偏旁是什么| 什么是阴道炎| 一什么影子| epa是什么意思| 小腿发胀是什么原因| 宝宝睡觉出汗是什么原因| 目赤是什么症状| 女生无缘无故头疼是什么原因| 医是什么结构| 奔跑的马是什么牌子的车| 炖牛肉放什么料| 实字五行属什么| 身上为什么会长小肉球| 眼睛痛什么原因| 角弓反张是什么意思| 一加一为什么等于二| 味极鲜是什么| 条条框框是什么意思| 懿是什么意思| 男性查hpv挂什么科| 口腔溃疡是什么原因造成的| 钙片什么时候吃效果最好| vca是什么意思| 什么手机像素好| 老年人骨质疏松吃什么钙片好| 仿佛是什么意思| 醛固酮高吃什么降压药| 临产是什么意思| 什么时候敷面膜是最佳时间| 办健康证需要检查什么| 看肺结节挂什么科| 革兰阳性杆菌是什么病| 什么是预科生| 尿崩症是什么意思| 女朋友生日送什么礼物好| 心电图是检查什么的| 用什么消肿最快最有效方法| 乳腺结节钙化是什么意思| 陪衬是什么意思| 折耳猫是什么| 白细胞数目偏高是什么意思| 血压偏低吃什么| 答非所问是什么意思| 藿香正气水什么味| 男孩子断掌有什么说法| 失温是什么意思| 调羹是什么意思| 为什么会口臭的原因| 希望孩子成为什么样的人| 银川有什么特产| 为什么老想睡觉| 檀木手串有什么好处| 鱼香肉丝为什么没有鱼| 突然腰疼是什么原因| 早晨五点是什么时辰| 冷幽默是什么意思| 心肌供血不足吃什么| 马眼是什么意思| 卡密是什么| 胃疼需要做什么检查| 什么的火焰| 被蝎子蛰了用什么药| 胶原蛋白什么牌子好| 心脏供血不足吃什么药好| 顺理成章是什么意思| 喉咙痛有痰吃什么药| 薤白是什么东西| 月经量少是什么原因| 静脉曲张有什么表现| 一元硬币是什么材质| 手指起倒刺是什么原因| leep术是什么手术| 为什么一吃东西就拉肚子| 犀利是什么意思| 物有所值是什么意思| 克氏针是什么| 肛门痒挂什么科检查| 什么是机械表| 下眼袋发青是什么原因| 女人为什么会出轨| 红米是什么米| 食用香精是什么| 什么东西能吃能喝又能坐| 蜂蜜喝了有什么好处| 麻鸭是什么鸭| en是什么意思| 长相厮守是什么意思| 竹棉和纯棉有什么区别| 为什么姨妈会推迟| 什么叫上升星座| 什么是情感障碍| 血糖高吃什么药最好| 睡觉起来口苦是什么原因| 阑尾疼吃什么药| theme什么意思| 总是嗜睡是什么原因| 11月24日是什么星座| e站是什么| 腹泻能吃什么水果| 湖北古代叫什么| 卖淫什么意思| 戴字五行属什么| 12月26日是什么星座| 穷极一生是什么意思| 什么叫信仰| l代表什么意思| 蚊子怕什么植物| 长方形脸适合什么发型| hpv是什么病毒| 三十年婚姻是什么婚| 唐字五行属什么| 高晓松为什么进监狱| img是什么意思| 看情况是什么意思| 什么大腰粗| 阿玛尼手表算什么档次| 为什么会有蟑螂| 蚊子怕什么味道| 为什么订婚后容易分手| 辰龙是什么意思| 医生为什么看瞳孔知道没救了| 不拘一格是什么意思| 容祖儿老公叫什么名字| 大姨妈量多是什么原因| 白带过氧化氢阳性什么意思| 吃大枣有什么好处| 喉咙有烧灼感吃什么药| 伤口感染用什么药| 中药用什么锅熬效果最佳| 羊肉炖什么好吃又营养| 声援是什么意思| 男性补肾壮阳吃什么药效果比较好| 爱生闷气的人容易得什么病| 吃什么缓解痛经| 斩金念什么| 喉炎吃什么药好得快| 喝太多水对身体有什么影响| 喝咖啡对身体有什么好处| 一月8日是什么星座| 惺惺相惜什么意思| 肾气不足吃什么中成药| 手脚肿胀是什么原因引起的| 6月19是什么星座| 胃反酸水是什么原因| 卵黄囊回声是什么意思| 不拘是什么意思| 乐极生悲是什么意思| 膳食是什么意思| 降尿酸吃什么药| 葛根粉吃了有什么好处| 鹦鹉吃什么蔬菜| 睡觉时身体抽搐是什么原因| 1932年属什么生肖| parzin眼镜是什么牌子| 非议是什么意思| 国家能源局是什么级别| 胖大海是什么东西| 肾不好会有什么症状| nap是什么意思| d二聚体是检查什么的| 鸭蛋炒什么好吃| 男男叫什么| 牛顿三大定律是什么| 医学上是什么意思| 女生爱出汗是什么原因| 无学历学什么技术好| 开心的动物是什么生肖| 肾出血是什么原因引起的| 什么鸟叫声最好听| 歺是什么意思| 百度Zum Inhalt springen

央视新闻节目聚焦十三届全国人大一次会议重要议程

aus Wikipedia, der freien Enzyklop?die
(Weitergeleitet von ECMAScript)
JavaScript
百度 谁能比我惨!勇士队客场以75-89不敌马刺,在库里、杜兰特和汤普森休战的情况下,球队的唯一全明星格林也在第二节因伤离场,他们在最后一节还领先4分的情况下遭遇痛揍,这样的残阵实在有点让人心酸。
// Beispiel JavaScript
function halloWelt() {
	alert('Hello World');
}
window.addEventListener('load', halloWelt);
Basisdaten
Paradigmen: multiparadigmatisch
Erscheinungsjahr: 1995
Designer: Brendan Eich
Entwickler: Brendan Eich
Aktuelle Version: ECMAScript 2023[1]  (Juni 2023)
Typisierung: schwach, dynamisch, duck
Wichtige Implementierungen: SpiderMonkey, Rhino, JavaScriptCore, V8
Beeinflusst von: Self, C, Scheme, Perl, Python, Java, Lua
Beeinflusste: ActionScript, Haxe, CoffeeScript, Dart, TypeScript
Lizenz: BSD
www.ecma-international.org/publications-and-standards/standards/ecma-262/

JavaScript (kurz JS) ist eine Skriptsprache, die ursprünglich 1995 von Netscape für dynamisches HTML in Webbrowsern entwickelt wurde, um Benutzerinteraktionen auszuwerten, Inhalte zu ver?ndern, nachzuladen oder zu generieren und so die M?glichkeiten von HTML zu erweitern.[2] Heute wird JavaScript auch au?erhalb von Browsern angewendet, etwa auf Servern und in Microcontrollern.[3][4]

Der heutige Name der ursprünglich LiveScript genannten Sprache entstand 1996 aus einer Kooperation von Netscape mit Sun Microsystems. Deren Java-Applets, erstellt mit der gleichfalls 1995 ver?ffentlichten Programmiersprache Java, wurden mithilfe von LiveScript in den Netscape Navigator integriert. Um die Popularit?t von Java zu nutzen, wurde LiveScript in JavaScript umbenannt, obwohl die beiden Sprachen voneinander unabh?ngig entwickelt wurden und v?llig unterschiedliche Grundkonzepte aufweisen.

Der als ECMAScript (ECMA 262) standardisierte Sprachkern von JavaScript beschreibt eine dynamisch typisierte, objektorientierte, aber klassenlose Skriptsprache. Sie wird allen objektorientierten Programmierparadigmen unter anderem auf der Basis von Prototypen gerecht, deren Deklaration ab ECMAScript 6 mit einer Syntax erm?glicht wird, wie sie ?hnlich auch bei klassenbasierten Programmiersprachen üblich ist. In JavaScript l?sst sich je nach Bedarf objektorientiert, prozedural oder funktional programmieren.[5]

Die Syntax von JavaScript ?hnelt C-Abk?mmlingen. Trotz der Namens- und syntaktischen ?hnlichkeit hat JavaScript nur geringe Gemeinsamkeiten mit Java. So wird in JavaScript Vererbung nicht durch Klassen, sondern durch Prototypen unterstützt.

JavaScript wurde früher haupts?chlich clientseitig eingesetzt. JavaScript bzw. die ECMAScript-Implementierungen erm?glichen aber beispielsweise mit dem Framework Node.js[6] und als JScript bzw. JScript .NET in einer ASP- bzw. ASP.NET-Umgebung auf Microsoft Internet Information Services auch serverseitige Anwendungen. Weitere Beispiele für serverseitige JavaScript-Programmierung sind POW und Jaxer, die auf der Mozilla-JavaScript-Engine SpiderMonkey aufsetzen, V8CGI, welches auf der JavaScript-Implementierung V8 aufbaut und in den Apache HTTP Server integriert wird, sowie QML, eine erweiterte Form von JavaScript zum Zeichnen von Oberfl?chen und Animationen.

Die Sprache wird auch als Skriptsprache für Spiele und Anwendungsprogramme eingesetzt, da der Sprachkern nur wenige Objekte enth?lt und dadurch der zur Ausführung von in JavaScript formulierten Skripten erforderliche Interpreter relativ klein gehalten werden kann.

Au?erdem wird JavaScript als Verkehrssprache in der Datenbank MongoDB sowie in Microcontrollern eingesetzt.[3][4]

Typische Anwendungsgebiete

[Bearbeiten | Quelltext bearbeiten]

Typische Anwendungsgebiete von JavaScript im Webbrowser sind:

  • dynamische Manipulation von Webseiten über das Document Object Model
  • Plausibilit?tsprüfung (Datenvalidierung) von Formulareingaben noch vor der übertragung zum Server
  • Anzeige von Dialogfenstern
  • Senden und Empfangen von Daten, ohne dass der Browser die Seite neu laden muss (Ajax)
  • Vorschlagen von Suchbegriffen w?hrend der Eingabe
  • Werbebanner oder Laufschriften
  • Verschleierung von E-Mail-Adressen zur Bek?mpfung von Spam
  • mehrere Frames auf einmal wechseln oder die Seite aus dem Frameset l?sen
  • Schreib- und Lesezugriff auf Cookies und den Web Storage innerhalb des Browsers

Einige Anwendungen, die mit JavaScript m?glich sind, agieren teilweise gegen den Wunsch des Benutzers oder widersprechen dem Prinzip der geringsten überraschung. Einige Browser bieten daher Funktionen an, die derartige JavaScript-Funktionen unterdrücken.

Beispiele:

Hinweis im Firefox-Browser bei vielen Dialogfenstern
  • Verschleiern der Internetadresse, auf die ein gegebener Link verweist
  • Deaktivieren des Kontextmenüs, um zu erschweren, dass Bilder oder die gesamte Seite abgespeichert werden k?nnen
  • Deaktivieren der Kopierfunktion, um zu erschweren, dass Texte oder Bilder kopiert werden k?nnen
  • Unaufgeforderte (Werbe-)Pop-ups oder Pop-unders oder aufeinanderfolgende Dialogfenster, die den Benutzer behindern
  • Ungewolltes Schlie?en des Browserfensters
  • Ungewollte Gr??en?nderung des Browserfensters
  • Barrierearme Webseiten zeichnen sich dadurch aus, dass sie auch bei abgeschaltetem JavaScript m?glichst uneingeschr?nkt nutzbar bleiben. Teilweise schr?nkt das deaktivierte JavaScript die Benutzbarkeit einer Webseite ein.
  • Ma?nahmen, die an den Sicherheitseinstellungen des Browsers vorbei ein Wiedererkennen eines Benutzers bei einem sp?teren Besuch einer Website erlauben (siehe Anonymit?t im Internet)
  • Bei anf?lligen Webanwendungen kann JavaScript auch von Dritten missbraucht werden, etwa per XSS (Codeeinschleusung).

Am 18. September 1995 ver?ffentlichte Netscape mit der Vorversion des Navigators 2.0 einen Browser mit einer eingebetteten Skriptsprache, die zu diesem Zeitpunkt LiveScript hie? und von Brendan Eich entwickelt worden war. Die Sprache konnte u. a. Formulareingaben des Benutzers vor dem Absenden überprüfen. Am 4. Dezember 1995 verkündeten Netscape und Sun Microsystems eine Kooperation, die die Interaktion von LiveScript direkt mit Java-Applets zum Ziel hatte. Sun entwickelte die n?tigen Java-Klassen, Netscape die Schnittstelle LiveConnect und benannte die Sprache in JavaScript um (JavaScript 1.0).[7][8] JavaScript ist seit der übernahme von Sun Microsystems eine Marke des Unternehmens Oracle.[9]

Mit der ersten Beta-Version des Navigators 3.0 führte Netscape am 29. April 1996 JavaScript 1.1 ein. In selbiger Version gab es die Neuerungen, auf Bilder zugreifen und sogenannte Rollover-Grafiken erstellen zu k?nnen. LiveConnect war jetzt fester Bestandteil des Browsers. Mit der Beta-Version des Internet Explorers 3 stellte Microsoft im Mai 1996 seinen ersten JScript-f?higen Browser vor. Dies war der Beginn des Browserkriegs.[10][11]

Mit der Ankündigung des Netscape Communicators wurde JavaScript 1.2 am 15. Oktober 1996 ver?ffentlicht; der Netscape Communicator 4.0 mit JavaScript 1.2 erschien jedoch erst am 4. Juni 1997. Ebenfalls im Juni 1997 ver?ffentlichte die European Computer Manufacturers Association ihren Standard ECMA-262 (ECMAScript), der zusammen mit Netscape entwickelt worden war und die Grundelemente einer Skriptsprache standardisieren sollte. Diese wurde im April 1998 zur ISO-Norm ISO/IEC 16262:1998 Information technology – ECMAScript language specification. Am 1. Oktober 1997 kam der Internet Explorer 4 heraus, der den Sprachumfang von JavaScript 1.1 abdeckte. Darüber hinaus wurden eigene Erweiterungen ver?ffentlicht, die zu Kompatibilit?tsunterschieden zwischen Navigator und Internet Explorer führten und eine DOM-?hnliche Syntax zur Verfügung stellten, die es erm?glichte, auf alle Elemente der Webseite zuzugreifen und diese beliebig ver?ndern zu k?nnen.

Der in Java implementierte JavaScript-Interpreter Rhino wurde ab Version 6.0 als Teil der Java-Laufzeitumgebung standardm??ig mitgeliefert.[12] Im Juli 1998 wurde mit der Beta-Version des Netscape Communicators 4.5 JavaScript 1.3, welche schon in der Version 4.06 des Netscape Communicators vorhanden war, ver?ffentlicht.[13] Im Oktober 1998 stellte Netscape JavaScript 1.4 vor. Diese Version war vollst?ndig kompatibel mit ECMA-262. Ein Browser mit der Unterstützung dieser Version erschien jedoch nicht.[14][15] Im April 2000 kam mit der Preview Release 1 des Navigators 6 JavaScript 1.5 und DOM Level 1. Am 5. Juni 2002 erschien Mozilla 1.0 mit JavaScript 1.5 (JavaScript in der Version 1.5 entspricht ECMA-262 Version 3),[16] am 29. November 2005 Mozilla Firefox 1.5 mit JavaScript 1.6[17], am 12. Juli 2006 Mozilla Firefox 2.0b1 mit JavaScript 1.7[18] und am 18. Dezember 2007 Mozilla Firefox 3.0b2 mit JavaScript 1.8.[19]

Versionsgeschichte von JavaScript

[Bearbeiten | Quelltext bearbeiten]
Versionsgeschichte[20]
Version Ver?ffentlichung Entsprechung Netscape Navigator Mozilla Firefox Internet Explorer Opera Safari Google Chrome
?ltere Version; nicht mehr unterstützt: 1.0.0 M?rz 1996 2.0 3.0
?ltere Version; nicht mehr unterstützt: 1.1.0 August 1996 3.0
?ltere Version; nicht mehr unterstützt: 1.2.0 Juni 1997 4.0–4.05
?ltere Version; nicht mehr unterstützt: 1.3.0 Oktober 1998 ECMA-262 1st edition / ECMA-262 2nd edition 4.06–4.7x 4.0
?ltere Version; nicht mehr unterstützt: 1.4.0 Netscape Server
?ltere Version; nicht mehr unterstützt: 1.5.0 November 2000 ECMA-262 3rd edition 6.0 1.0
  • 5.5 (JScript 5.5)
  • 6 (JScript 5.6)
  • 7 (JScript 5.7)
  • 8 (JScript 6)
  • 6.0
  • 7.0
  • 8.0
  • 9.0
?ltere Version; nicht mehr unterstützt: 1.6.0 November 2005 1.5 + Array extras + Array & String generics + E4X 1.5
  • 3.0
  • 3.1
?ltere Version; nicht mehr unterstützt: 1.7.0 Oktober 2006 1.6 + Pythonic generators + Iterators + let + destructuring assignments 2.0
  • 3.2
  • 4.0
1.0
?ltere Version; nicht mehr unterstützt: 1.8.0 Juni 2008 1.7 + Generator expressions + Expression closures 3.0
?ltere Version; nicht mehr unterstützt: 1.8.1 Juni 2009 1.8 + geringfügige Updates 3.5
Aktuelle Version: 1.8.2 Januar 2010 1.8.1 + geringfügige Updates 3.6
Aktuelle Version: 1.8.5 Juli 2010 1.8.1 + ECMAScript 5 Compliance 4 9.0 (JScript 9.0)

Versionsgeschichte von ECMAScript (ECMA-262)

[Bearbeiten | Quelltext bearbeiten]

Die aktuelle Version ist die Version 2022, die im Juni 2022 als ?ECMAScript 2022“ ver?ffentlicht wurde.[21] Dieser sollen j?hrliche Updates folgen.[22] Die Entwicklung der Standards erfolgt auf GitHub.[23]

Version publiziert am Unterschiede zur Vorg?ngerversion Editor
?ltere Version; nicht mehr unterstützt: 1 Juni 1997 erste Version Guy L. Steele, Jr.
?ltere Version; nicht mehr unterstützt: 2 Juni 1998 ?nderungen zwecks Kompatibilit?t zum internationalen Standard ISO/IEC 16262 Mike Cowlishaw
?ltere Version; nicht mehr unterstützt: 3 Dez. 1999 Neu sind regul?re Ausdrücke, bessere Verarbeitung von Zeichenketten, Kontrollfluss, Fehlerbehandlung mit try/catch, bessere Fehlerbehandlung, bessere Formatierung bei der Ausgabe von Zahlen usw. Mike Cowlishaw
?ltere Version; nicht mehr unterstützt: 4 abgebrochen Wegen Uneinigkeit in Bezug auf die Zukunft der Sprache wurde die weitere Entwicklung des komplexen Entwurfes zu ECMAScript 4 eingestellt. Einige Ideen werden in ES6 wieder aufleben.
?ltere Version; nicht mehr unterstützt: 5 Dez. 2009 Im ?strict mode“ wird eine erweiterte Fehlerprüfung eingeschaltet. Unklare Sprachkonstrukte von ECMAScript 3 werden entsch?rft und neue Features wie getter- und setter-Methoden, Unterstützung von JSON usw. hinzugefügt.[24] Pratap Lakshman, Allen Wirfs-Brock
?ltere Version; noch unterstützt: 5.1 Juni 2011 Entspricht dem internationalen Standard ISO/IEC 16262:2011, Version 3 Pratap Lakshman, Allen Wirfs-Brock
?ltere Version; noch unterstützt: 2015[25][26] Juni 2015 Neue Syntax für komplexe Applikationen wie Klassen und Module, die aber mit ?hnlicher Terminologie wie in ECMAScript 5 (strict mode) definiert werden k?nnen.[27] Neue Sprachbestandteile wie for/of-Schleifen, teilweise an Python angelehnte Syntax usw. Der Codename lautet “Harmony” und wurde bis kurz vor Verabschiedung als ?ECMAScript 6“ bezeichnet,[28] also ?ES6“[29]. Allen Wirfs-Brock
?ltere Version; noch unterstützt: 2016[30][31] Juni 2016 ** (Potenzfunktion), Array.prototype.includes, diverse Anpassungen an Generatoren, destruktiven Zuweisungen[32] Brian Terlson
?ltere Version; noch unterstützt: 2017[33] Juni 2017 async/await, diverse Object-Funktionen[32][34][35] Brian Terlson
?ltere Version; noch unterstützt: 2018 Juni 2018[36] global, import(), Rest/Spread Properties, for-await-of (Asynchronous Iterators), String-Padding, …[37] Brian Terlson
?ltere Version; noch unterstützt: 2019 Juni 2019 Array#{flat,flatMap}, Object.fromEntries, String#{trimStart,trimEnd}, Symbol#description, …[38] Brian Terlson, Bradley Farias, Jordan Harband
?ltere Version; noch unterstützt: 2020 Juni 2020 String.matchAll, BigInt, import(), …[39] Jordan Harband, Kevin Smith
?ltere Version; noch unterstützt: 2021 Juni 2021 String.prototype.replaceAll, WeakRefs, Logical Assignment Operators, …[40] Jordan Harband, Shu-yu Guo, Michael Ficarra, Kevin Gibbons
?ltere Version; noch unterstützt: 2022[41] Juni 2022 Private Methoden und Felder in Klassen, Statische Initialisierungs-Bl?cke in Klassen, await au?erhalb von async-Funktionen, …[42] Shu-yu Guo, Michael Ficarra, Kevin Gibbons
Aktuelle Version: 2023 Juni 2023 Hashbang-Grammar, Symbole für WeakMaps, neue Array-Funktionen

Sandbox-Prinzip

[Bearbeiten | Quelltext bearbeiten]

JavaScript wird im Browser in einer sogenannten Sandbox ausgeführt. Dies soll bewirken, dass man in JavaScript nur Zugriff auf die Objekte des Browsers hat und nicht auf das Dateisystem zugreifen kann. Eine Ausnahme stellt der Lesezugriff auf eine Datei dar, die per Dateiauswahl-Dialog, gestartet mit dem HTML-Element <input type="file">, vom Benutzer ausgew?hlt wurde.

Um Sicherheitsprobleme wie das sogenannte Cross-Site-Scripting zu verhindern, wird jede Website oder Webanwendung innerhalb des Browsers isoliert ausgeführt und ein Datenaustausch unterbunden. Ohne diesen Schutz w?re es m?glich, über eine Seite Schadcode auszuführen, der beispielsweise Bank- oder Logindaten in anderen parallel ge?ffneten Browserfenstern ausliest oder manipuliert.

Auch bestimmte sicherheitsrelevante Browserfunktionen wie das Schlie?en des Browserfensters, das Aus- und Einblenden von Symbolleisten, das ?ndern der Browserstartseite, der Zugriff auf die Zwischenablage oder das Auslesen der zuletzt besuchten Webseiten des Anwenders werden durch obligatorische Nutzereingaben geschützt.

Standardm??ig wird ein Skript innerhalb eines Browsers in Form eines einzigen Threads ausgeführt. Warteschleifen oder lange Berechnungen sind daher in JavaScript-Programmen zu vermeiden. Mit Worker-Objekten ist es m?glich, weitere Threads zu erzeugen.[43]

Deaktivieren von JavaScript

[Bearbeiten | Quelltext bearbeiten]

In vielen JavaScript-f?higen Browsern l?sst sich JavaScript abschalten oder lassen sich einzelne Aktionen wie die ?nderung des Textes in der Statusleiste oder die Manipulation von Browserfenstern deaktivieren. Dies kann bei einigen Browsern mittels Erweiterungen, die JavaScript anhand von White- und Blacklists gezielt auf Seiten ein- und ausschalten, auch automatisiert werden. Daher k?nnen sich Entwickler nicht darauf verlassen, dass JavaScript-Programme sich in jeder Umgebung gleich verhalten bzw. überhaupt funktionieren.

JavaScript ist dynamisch typisiert. Das bedeutet, dass die Zuweisung von Werten an Variablen keinen typbasierten Einschr?nkungen unterliegt. Allerdings gibt es diverse Erweiterungen von JavaScript, die eine statische Typisierung optional beziehungsweise zwingend erfordern, zum Beispiel TypeScript von Microsoft.[44]

Aufgrund der dynamischen Typisierung ist der Datentyp keine Eigenschaft einer Variablen, sondern Laufzeit-bezogen die Eigenschaft ihres aktuellen Wertes (oder auch die Eigenschaft eines Literals). Der Datentyp eines Wertes l?sst sich mit dem un?ren Operator typeof ermitteln.

Primitive Datentypen

[Bearbeiten | Quelltext bearbeiten]

Zu den primitiven Datentypen in JavaScript geh?ren Zahlen, Zeichenketten, boolesche Werte, Symbole, null und undefined.

  • Numerische Werte k?nnen entweder den Typ Number (angezeigt durch typeof als "number") oder BigInt haben (angezeigt durch typeof als "bigint"). W?hrend der Datentyp Number für Gleitkommazahlen verwendet wird, erm?glicht der Datentyp BigInt die Darstellung ganzer Zahlen beliebiger Gr??e, die den Bereich überschreiten, den Number abdecken kann.
  • Zeichenketten haben den Typ String (angezeigt durch typeof als "string").
  • Boolesche Werte haben den Typ Boolean (angezeigt durch typeof als "boolean")
  • Symbole haben den Typ Symbol (angezeigt durch typeof als "symbol") und fungieren als eindeutige Identifikatoren, werden jedoch seltener verwendet.
  • Der Typ Null hat nur den Wert null (typeof liefert "object", was historisch bedingt ist).
  • Der Typ Undefined hat nur den Wert undefined (typeof liefert "undefined").

Nicht primitive Datentypen

[Bearbeiten | Quelltext bearbeiten]

Funktionen sind kein primitiver Typ (typeof liefert "function"). Für alle anderen Werte – regul?re Ausdrücke, Arrays und den Wert null inbegriffen – liefert typeof den Zeichenketten-Wert "object" zurück. Es ist zu beachten, dass null ein primitiver Datentyp ist, auch wenn typeof für null aus historischen Gründen den Wert "object" liefert. Im Gegensatz zu anderen Programmiersprachen gibt es in JavaScript keine echten assoziativen Arrays.[45]

Objekte, die durch die vordefinierten Konstruktorfunktionen String(), Number() und Boolean() erzeugt werden, verhalten sich ?hnlich wie Werte der entsprechenden primitiven Datentypen. Allerdings gibt der typeof-Operator für solche Objekte den Wert "object" zurück. Diese Art von Objekten wird als Wrapper-Objekte bezeichnet. Für den Datentyp Symbol existiert keine gleichnamige Konstruktorfunktion. Im Folgenden finden wir ein Beispiel einer Variablen und dem entsprechenden Wrapper-Objekt:

let simpleString = "Beispieltext";
// Die Funktion "alert" gibt das Ergebnis "string" in einem Fenster aus.
alert(typeof simpleString);

let stringObject = new String("Beispieltext");
alert(typeof stringObject); // ergibt "object"

Umgekehrt werden Werte der primitiven Typen Number, Boolean und String bei Bedarf automatisch in Objekte der entsprechenden Konstruktorfunktion umgewandelt:

let simpleString = "Beispieltext";
alert(simpleString.length); // ergibt 12

In diesem Beispiel wird die Eigenschaft length aufgerufen, obwohl simpleString ein primitiver String ist. JavaScript wandelt automatisch den primitiven String in ein tempor?res String-Objekt um, um die Eigenschaft length abzurufen.

Kontrollstrukturen

[Bearbeiten | Quelltext bearbeiten]

JavaScript kennt die üblichen Kontrollstrukturen. Sollen diese mehr als eine Anweisung enthalten, so muss ein in geschweifte Klammern eingeschlossener Block eingesetzt werden. Anweisungen werden mit einem Semikolon abgeschlossen. Dies ist aber in den meisten F?llen optional; durch die automatic semicolon insertion wird es meist automatisch erg?nzt.

if-else (Bedingte Anweisung)

[Bearbeiten | Quelltext bearbeiten]
if (bedingung) {
    anweisungen;
} else {
    anweisungen;
}

Kurzschreibweise für bedingte Wertzuweisungen:

variable = bedingung ? wertWennWahr : wertWennFalsch;

switch-Kontrollstruktur

[Bearbeiten | Quelltext bearbeiten]
switch (variable) {
    case wert1:
        anweisungen;
        break;
    case wert2:
        anweisungen;
        break;
    default:
        anweisungen;
}

while-Schleife

while (bedingung) {
    anweisungen;
}

do-while-Schleife

do {
    anweisungen;
} while (bedingung);

for-Schleife

for (startausdruck; bedingung; iterationsausdruck) {
    anweisungen;
}

for … in-Schleife

Mit dieser Anweisung werden alle eigenen und ererbten Eigenschaften eines Objektes durchlaufen, die das interne Attribut Enumerable aufweisen.[46] Dieses Attribut wurde in ECMA Script 5 eingeführt und ist für bestimmte eingebaute Eigenschaften (wie z. B. die Funktion toString des Prototyps Object) nicht gesetzt, es kann allerdings im Regelfall vom Benutzer gesetzt (und entfernt) werden.[47] Bei jedem Schleifendurchgang wird einer angegebenen Variable der Eigenschaftsname zugewiesen.

for (let eigenschaftsname in objekt) {
    anweisungen;
}

for … of-Schleife

Diese Kontrollstruktur funktioniert wie eine for … in-Schleife, mit dem Unterschied, dass hier der angegebenen Variable nicht der Eigenschaftsname, sondern der Eigenschaftswert zugewiesen wird.[48]

for (let wert of objekt) {
    anweisungen;
}

Variablen sollten in JavaScript mit let oder var deklariert werden und sind dann innerhalb des Scopes gültig, in dem sie deklariert wurden, wobei let den Scope weiter eingrenzt als var.[49] Verwendet man Variablen ohne sie vorher explizit zu deklarieren, werden diese implizit als Eigenschaften des globalen Objekts (im Browser window) deklariert; dieses Verhalten kann man durch die Anweisung "use strict"; unterbinden. Eine Besonderheit von JavaScript ist das Hoisting von Variablen, das dafür sorgt, dass s?mtliche in einem Codeabschnitt deklarierten Variablen und Funktionen bei der Abarbeitung automatisch direkt an den Anfang vorgezogen werden (nur die Deklaration, nicht aber deren Wertzuweisung).

Geltungsbereich von Variablen

[Bearbeiten | Quelltext bearbeiten]

In JavaScript gibt es globale und lokale Variablen abh?ngig davon, wo sie deklariert werden und wie sie verwendet werden.

  • Globale Variablen:

Variablen, die au?erhalb von Funktionen deklariert werden, sind global gültig. Im Browser bedeutet global, dass solche Variablen auf der gesamten Webseite und in allen aktiven JavaScript-Dateien zug?nglich sind. Dies kann zu unerwünschten Nebeneffekten führen, insbesondere wenn andere Skripte wie Drittanbieter-Plugins, Web Analytics oder Werbebannern eingebunden sind. Daher sollten globale Variablen nach M?glichkeit vermieden werden.

let explicit; // Explizite Deklaration einer globalen Variable
explicit = "explizit deklariert"; // Definition einer globalen Variable
console.log(explicit); // Ausgabe: explizit deklariert

Implizit deklarierte Variablen sind immer global. Auch wenn eine Variable innerhalb einer Funktion implizit ohne let oder var deklariert wurde, wird sie automatisch zu einer globalen Variable.

function foo() {
    implicit = "implizit deklariert"; // Definition einer globalen Variable
}

foo();
console.log(implicit); // Ausgabe: implizit deklariert

Eine implizit deklarierte Variable wird automatisch zu einer Eigenschaft des globalThis-Objekts. Das trifft bei explizit deklarierten globalen Variablen nicht zu.

console.log(globalThis.implicit); // Ausgabe: implizit deklariert
console.log(typeof globalThis.explicit); // Ausgabe: undefined
  • Lokaler Geltungsbereich:

Variablen, die innerhalb von Funktionen deklariert oder als Funktionsparameter verwendet werden, haben einen lokalen Geltungsbereich. Das bedeutet, dass sie nur innerhalb der Funktion sichtbar und zug?nglich sind.

function bar(parameter) { // Deklaration eines Funktionsparameters
    let variable = "lokale Variable" // Deklaration einer lokalen Variablen

    console.log(parameter);
    console.log(variable); // Ausgabe: lokale Variable
}

bar("lokaler Parameter");
console.log(typeof parameter); // Ausgabe: undefined
console.log(typeof variable); // Ausgabe: undefined

Konstanten sollen mit const deklariert werden, bei der Initialisierung muss ihnen ein Wert zugewiesen werden. Für den Gültigkeitsbereich gelten dieselben Bedingungen wie bei Variablendeklarationen mit let. Konstanten k?nnen nicht durch erneute Zuweisung ver?ndert werden, allerdings k?nnen – wenn es sich bei der Konstanten um Objekte handelt – einzelne Eigenschaften der Konstanten ge?ndert werden.[50]

In JavaScript sind Funktionen vollwertige Objekte mit eigenen Methoden und Eigenschaften. Sie k?nnen erstellt, überschrieben, als Argumente an andere Funktionen übergeben und von diesen erzeugt und zurückgegeben werden.

Im letzteren Fall entsteht eine Closure, auch Funktionsabschluss genannt, die beispielsweise Datenkapselung erm?glicht:

function createGreeting(name) {
    let message = "Hallo, " + name + "!";

    return function() {
        return message;
    };
}

// 'greetAda' ist eine Funktion, die von 'createGreeting' zurückgegeben wird
let greetAda = createGreeting("Ada Lovelace");
console.log(greetAda()); // Ausgabe: Hallo, Ada Lovelace!

// 'greetAlan' ist eine Funktion, die von 'createGreeting' zurückgegeben wird
let greetAlan = createGreeting("Alan Turing");
console.log(greetAlan()); // Ausgabe: Hallo, Alan Turing!

// Der Zugriff auf den Wert 'message' ist von au?en nicht m?glich
console.log(typeof message); // Ausgabe: undefined

Nicht jedes Argument einer Funktion muss beim Aufruf angegeben werden. Fehlende Argumente erhalten den Wert undefined. Seit ECMAScript 2015 k?nnen Parameter auch mit Standardwerten definiert werden. Au?erdem erm?glicht das arguments-Objekt den Zugriff auf die Argumente innerhalb der Funktion.

Es gibt mehrere M?glichkeiten, in JavaScript Funktionen zu erzeugen:[51]

  • Funktionsdeklarationen (?Function Declarations“):
function f(x, y) {
    return x + y;
}
  • Funktionsausdrücke (?Function Expressions“):
let f = function(x, y) {
    return x + y;
};
  • Sofort ausgeführte Funktionsausdrücke (?Immediately-Invoked Function Expressions“):

Anonyme Funktionen k?nnen auch direkt ausgeführt werden, ohne sie vorher einer Variable zuzuweisen. Das kann zur Kapselung des Gültigkeitsbereichs von Variablen verwendet werden.

(function(x, y) {
    return x + y;
})(2, 3);
  • Benannte Funktionsausdrücke (?Named Function Expressions“):

Der Variablen f wird eine Funktion mit Bezeichner g zugewiesen. Au?erhalb der Funktion ist sie mit f ansprechbar, innerhalb mit f und g.

let f = function g(x, y) {
    return x + y;
};
  • Funktionskonstruktor (?Function Constructors“):
let f = new Function('x', 'y', 'return x + y;');
  • Pfeilfunktionen (?Arrow Functions“):

Die runden Klammern sind optional, falls die Funktion genau ein Argument hat. Werden die geschweiften Klammern weggelassen, muss man genau einen Ausdruck ohne return als Rückgabewert angeben. Mit geschweiften Klammern kann man beliebigen Code angeben, muss aber für Rückgabewerte return verwenden.

(x, y) => x + y;
(x, y) => { return x + y; };
x => x + 1;
x => { return x + 1; };

// Eine so erzeugte Funktion kann man natürlich auch einer Variablen zuweisen
let f = (x, y) => x + y;

Eine funktionale und rekursive Implementierung des Euklidischen Algorithmus mit zwei Argumenten sieht folgenderma?en aus:

function euklid(a, b) {
    if (b === 0)
        return a;

    return euklid(b, a % b);
}

Implementierung des Euklidischen Algorithmus mit beliebig vielen Argumenten durch Reduzierung von numbers auf einen einzigen Wert, indem jeweils zwei Elemente von links nach rechts mit euklid ausgewertet werden:

function ggT(...numbers) {
    let reduce = 0;

    for (element of numbers)
        reduce = euklid(element, reduce);

    return reduce;
}

console.log(ggT());           // 0
console.log(ggT(4));          // 4
console.log(ggT(24, 36, 84)); // 12

Implementierung des Euklidischen Algorithmus mit partieller Anwendung:

function ggT(reduce) {
    if (reduce === undefined)
        return 0;

    return function(element) {
        if (element === undefined)
            return reduce;

        return ggT(euklid(element, reduce));
    };
}

console.log(ggT());             // 0
console.log(ggT(4)());          // 4
console.log(ggT(24)(36)(84)()); // 12

Objekte in JavaScript bestehen aus Eigenschaften, die als Name/Wert-Paar realisiert werden. Dabei wird nicht zwischen Attributen und Methoden des Objektes unterschieden (eine Eigenschaft, deren Wert den Typ Function besitzt, fungiert als Methode). Jedes Objekt – auch durch Literale erzeugte Objekte – erbt vom Prototyp des globalen Objekt-Konstruktors.

Vordefinierte Objekte

[Bearbeiten | Quelltext bearbeiten]

JavaScript kennt mehrere eingebaute Objekte und Objekttypen, die im Standard ECMAScript definiert sind. Dabei wird ein Objekttyp durch eine namensgleiche Konstruktorfunktionen repr?sentiert, die zur Erzeugung von Objekten des entsprechenden Typs verwendet werden kann und zugleich einen Verweis auf den Prototyp des Objekttyps beinhaltet.

  • Das namenlose globale Objekt, das alle Variablen und Objekte enth?lt.
  • Der Objekttyp Object, von dem alle Objekte abgeleitet sind.
  • Der Objekttyp Function von Funktionen.
  • Der Objekttyp Array von Arrays.
  • Der Objekttyp String von Zeichenketten.
  • Der Objekttyp Boolean von boolesche Variablen.
  • Der Objekttyp Number von Zahlen (64-Bit-Gleitkommazahlen gem?? IEEE 754).
  • Der Objekttyp Date für Datumsformate (Daten bzw. Zeitpunkte).
  • Der Objekttyp RegExp für regul?re Ausdrücke.
  • Der Objekttyp Error zur Charakterisierung (und ggf. nachfolgenden Ausl?sung mittels throw) von Laufzeitfehlern.
  • Das Objekt Math stellt Konstanten und Methoden für mathematische Operationen bereit.
  • Das Objekt JSON stellt zwei Methoden für die Serialisierung von Objekten ins JSON-Format und umgekehrt bereit.
  • Das Objekt Reflect stellt Methoden für die Ermittlung und ?nderung der Metadaten eines Objekts bereit.

Weitere Objekte, die beim clientseitigen JavaScript verwendet werden, entstanden historisch vor allem durch die Netscape-Spezifikationen (window, document usw.). Das window-Objekt selbst ist dabei de facto das globale Objekt, indem einfach einer Variablen window das globale Objekt zugewiesen wurde. Zahlreiche Unterobjekte von document wurden mittlerweile durch DOM HTML standardisiert (title, images, links, forms usw.). Aktuelle Browser unterstützen zudem DOM Core und andere W3C-DOM-Standards sowie Erweiterungen von Microsoft JScript.

Zugriff auf Objekteigenschaften und -methoden

[Bearbeiten | Quelltext bearbeiten]

Eigenschaften von Objekten (auch Methoden sind Eigenschaften) k?nnen wie folgt angesprochen werden:

Punkt-Notation (mit statischen Bezeichnern)
objekt.eigenschaft;

objekt.methode(parameter1, parameter2);
Klammer-Notation (mit dynamischen Bezeichnern)
objekt["eigenschaft"];

objekt["methode"](parameter1, parameter2);

// Eigenschaftsname, der in Punktnotation illegal w?re
objekt["methode 1"]();

// So k?nnen auch alle Eigenschaften des Objekts durchlaufen werden
for (let eigenschaftsName in objekt) {
    console.log(eigenschaftsName, " = ", objekt[eigenschaftsName]);
}

Zu allen Objekten k?nnen zur Laufzeit neue Eigenschaften hinzugefügt oder mit delete bestehende entfernt werden:

// Statisch bzw. dynamisch benannte Eigenschaften hinzufügen:
objekt.eigenschaftA = "ein Wert";
objekt["eigenschaftB"] = "ein anderer Wert";

// Statisch bzw. dynamisch benannte Eigenschaften entfernen:
delete objekt.eigenschaftA;
delete objekt["eigenschaftB"];

Objekte k?nnen in JavaScript direkt anhand ihrer Eigenschaften definiert werden:

let meinObjekt = {
    zahl: 42,
    gibZahl: function() {
        return this.zahl;
    }
};

alert(meinObjekt.gibZahl()); // 42

Eine spezielle Notation gibt es für regul?re Ausdrücke:

// mit Konstruktorfunktion
(new RegExp("a")).test("ab"); // true

// als Literal
/a/.test("ab"); // true

Konstruktor-Funktionen

[Bearbeiten | Quelltext bearbeiten]

Eine Funktion kann dazu genutzt werden, um ein mit new erstelltes Objekt zu initialisieren. In diesem Fall spricht man von einem Konstruktor oder einer Konstruktor-Funktion. Innerhalb dieser Funktion kann das neue Objekt über die Variable this angesprochen werden.

function MeinObjekt(x) { // Konstruktor
    this.zahl = x;
}

let objekt = new MeinObjekt(3); // Instanz erzeugen
alert(objekt.zahl); // per Meldefenster ausgeben (3)

?Private“ Eigenschaften

[Bearbeiten | Quelltext bearbeiten]

Private Eigenschaften und Methoden sind nicht explizit Teil der Sprache.

Mit Hilfe von Closures (siehe Funktionen) lassen sich dennoch private Eigenschaften von Objekten realisieren:

let erschaffeKatze = function() {
    let lebensZahl = 7;

    let maunz = function() {
        return (lebensZahl > 0) ? "miau" : "?rks";
    };

    // gibt neues Objekt zurück
    return {
        toeten: function() {
            lebensZahl -= 1;
            alert(maunz());
        }
    };
};

let otto = erschaffeKatze();
otto.toeten(); // miau

Lediglich die toeten-Methode von otto kennt die Variable lebensZahl. Der Effekt gleicht dem einer privaten Eigenschaft, wenn alle Methoden der Katze in der erzeugenden Funktion erschaffeKatze definiert werden. lebensZahl ist dann für alle Methoden (privilegierte Methoden, im Beispiel toeten) und inneren Funktionen der erzeugenden Funktion (private Methoden, im Beispiel maunz) sichtbar, nicht jedoch von au?en oder von nachtr?glich an das Objekt geh?ngten Methoden.

Vererbung über Prototypen

[Bearbeiten | Quelltext bearbeiten]

Vererbung kann in JavaScript durch Prototypen realisiert werden. Dies erfordert, dass der prototype-Eigenschaft einer Konstruktor-Funktion ein als Prototyp dienendes Objekt zugewiesen wird. Wenn mit der Konstruktor-Funktion nun ein Objekt erzeugt wird, wird beim Zugriff auf eine nicht-existierende Eigenschaft des neuen Objekts die entsprechende Eigenschaft des Prototyps (wenn vorhanden) zurückgegeben. Beispiel:

let fisch = {
    augen: 2
};

let Mutantenfisch = function() {
    this.augen = 3;
};

Mutantenfisch.prototype = fisch;

let blinky = new Mutantenfisch();

// eigene Eigenschaft von blinky
alert(blinky.augen); // 3

// blinkys eigene Eigenschaft wird gel?scht
delete blinky.augen;

// blinky hat die Eigenschaft selbst nicht mehr,
// es schimmert die Eigenschaft des Prototyps durch
alert(blinky.augen); // 2

Um festzustellen, ob ein Objekt eine Eigenschaft selbst besitzt oder vom Prototyp geerbt hat, hat jedes Objekt (automatisch durch Vererbung von Object) die hasOwnProperty-Methode:

blinky.hasOwnProperty('augen'); // false

Fixierung von Objektstruktur und -inhalten

[Bearbeiten | Quelltext bearbeiten]

Die in JavaScript im Regelfall v?llig dynamische Struktur eines Objekts obj kann in verschiedener Hinsicht fixiert werden: Nach dem Methodenaufruf Object.preventExtensions(obj) k?nnen keine weiteren Attribute und Methoden mehr erg?nzt werden. Object.seal(obj) verhindert sowohl die Erweiterung wie die Streichung von Attributen und Methoden. Der Aufruf Object.freeze(obj) fixiert sowohl die Objektstruktur wie auch die Attributwerte inklusive der Methoden gegen nachfolgende Ver?nderungen. Die betreffenden Status eines Objekts obj k?nnen mit Object.isExtensible(obj), Object.isSealed(obj) und Object.isFrozen(obj) ermittelt werden.

Es ist auch m?glich, nur ein einzelnes Attribut eines Objekts obj zu fixieren. Beispielsweise wird mit dem Aufruf

Object.defineProperty(obj, "vorname", {writable:false});

das Attribut obj.vorname schreibgeschützt.[52]

Delegationsprinzipien

[Bearbeiten | Quelltext bearbeiten]

JavaScript ist eine Delegationssprache mit sowohl selbstausführendem als auch direktem Delegationsmechanismus.

Funktionsobjekte als Rollen (Traits und Mixins)
JavaScript unterstützt schon auf der Ebene des Sprachkerns verschiedene auf Funktionsobjekten aufbauende Implementierungen des Rollen-Musters[53] wie z. B. Traits[54][55] und Mixins.[56][57] Zus?tzliches Verhalten wird bereitgestellt, indem mindestens eine Methode über das Schlüsselwort this im Rumpf eines function-Objekts gebunden wird. Ben?tigt ein Objekt zus?tzliches Verhalten, welches ihm nicht über die Prototypenkette zur Verfügung gestellt werden kann, l?sst sich eine Rolle direkt über call bzw. apply an dieses Objekt delegieren.
Objektkomposition und Vererbung durch Delegation
W?hrend Komposition in JavaScript über diese direkte Delegation abgedeckt werden kann, kommt automatische Delegation immer dann zur Anwendung, wenn der Interpreter die Prototypenkette eines Objekts nach oben hin abwandern muss, um z. B. eine mit diesem Objekt assoziierte Methode zu finden, die diesem nicht unmittelbar geh?rt. Sobald die Methode gefunden ist, wird sie im Kontext dieses Objekts aufgerufen. Demzufolge wird Vererbung in JavaScript über einen selbstausführenden Delegationsmechanismus abgebildet, der an die prototype-Eigenschaft von Konstruktorfunktionen gebunden ist.

Fehlerbehandlung

[Bearbeiten | Quelltext bearbeiten]

Ab Version 3 verfügt ECMAScript über eine von Java übernommene Fehlerbehandlung. Die Anweisung try … catch … finally f?ngt Ausnahmen (exceptions) ab, die aufgrund eines Fehlers oder einer throw-Anweisung auftreten. Die Syntax lautet:

try {
    // Anweisungen, in denen Ausnahmen auftreten oder ausgel?st werden k?nnen
} catch (exception) {
    // Anweisungsfolge, die im Ausnahmefall ausgeführt wird.
    // In diesem Teil kann die Fehlerbehandlung erfolgen.
} finally {
    // Anweisungsfolge, die anschlie?end in jedem Fall ausgeführt wird.
}

throw "sample exception"; // wenn verfügbar, besser: Error-Objekt (siehe unten)

Zu Beginn werden die Anweisungen im try-Block ausgeführt. Falls eine Ausnahme auftritt, wird der Kontrollfluss sofort zum catch-Block mit dem Ausnahmeobjekt als Parameter umgeleitet.

Im Normalfall wird der Ausnahmeblock übersprungen. Nach der Ausführung des try-Blocks (auch teilweise) und gegebenenfalls des catch-Blocks werden in jedem Fall die Anweisungen im finally-Block ausgeführt. Der finally-Teil kann weggelassen werden, alternativ der catch-Teil.

Einige Laufzeitumgebungen wie V8 (und somit Node.js) und auch viele Webbrowser stellen gesonderte Error-Objekte zur Verfügung, die neben der Fehlermeldung auch einen Stacktrace und weitere Zusatzinformationen transportieren k?nnen.[58][59][60] Um diese Vorteile zu nutzen, ?ndert man im einfachsten Anwendungsfall den throw-Befehl von throw "Meldungstext"; zu throw new Error("Meldungstext");.[61]

Klammern um den Parameter des throw-Befehls sind im Allgemeinen nicht notwendig.[52] Sollten sie in Ausnahmef?llen ben?tigt werden, um beispielsweise einen auf mehrere Zeilen verteilten Parameter zusammenzufassen, kann die m?gliche Verwechslung mit einem Funktionsaufruf dennoch vermieden werden, indem man ein Leerzeichen zwischen throw und die ?ffnende Klammer einfügt.

JavaScript-Bibliotheken

[Bearbeiten | Quelltext bearbeiten]

Um die Erstellung von Webanwendungen mit Hilfe von JavaScript zu erleichtern, gibt es diverse Bibliotheken und Frameworks. Eine Bibliothek ist eine Sammlung von Funktionen, die der Programmierer nutzen kann. Ein Framework fordert darüber hinaus durch ein besonderes Ma? an Abstraktion eine bestimmte Struktur der Programmierung.

Ausgel?st von neuen Konzepten wie Ajax entstand seit 2004 ein neues Interesse für JavaScript. JavaScript wird zunehmend für Rich-Client-Anwendungen benutzt, die das Aussehen und die Bedienung von herk?mmlichen Desktop-Programmen auf Web-gestützte Anwendungen übertragen. JavaScript spielt dabei eine Schlüsselrolle, wenn es darum geht, Statusinformationen ohne Laden einer vollst?ndigen Seite zwischen Browser und HTTP-Server zu übertragen. Im Zuge dieser neuen Anforderungen entstanden verschiedene Bibliotheken, die die Entwicklung solcher Anwendungen vereinfachen wollen. Neben Ajax-Funktionalit?ten bieten die meisten dieser Bibliotheken eine eigene Basis für objektorientierte Programmierung, eine Abstraktionsschicht für das komfortable Arbeiten mit dem DOM sowie grafische Effekte wie Animationen. Aber auch schon vor dem breiten Einsatz von Ajax existierten Funktionssammlungen zur Unterstützung der browserübergreifenden Programmierung.[62]

Zu den bekannten JavaScript-Bibliotheken und Frameworks z?hlen AngularJS, Dojo Toolkit, Ext JS, jQuery, MooTools, Prototype, Qooxdoo, React, Vue.js und die Yahoo User Interface Library. Speziell mit grafischen Effekten besch?ftigen sich Moo.fx und Script.aculo.us. Für die serverseitige Programmierung mittels Node.js stehen eigene Bibliotheken und Frameworks bereit.

Einige Bibliotheken und insbesondere Frameworks erweitern die Sprache um zus?tzliche Funktionen, die h?ufig in sp?tere Versionen der Spezifikation einflie?en oder rüsten bei Bedarf ?ltere Implementierung per Polyfill nach.

JavaScript & Suchmaschinenoptimierung (SEO)

[Bearbeiten | Quelltext bearbeiten]

Suchmaschinen gehen unterschiedlich mit der Verarbeitung von Javascript-Inhalten um, wodurch es in den letzten Jahren immer wieder zu F?llen gekommen ist, dass Websites teilweise oder g?nzlich nicht in Suchmaschinen auffindbar waren. Der Suchmaschinenbetreiber Google kann laut eigenen Aussagen JavaScript-Inhalte crawlen, rendern und indexieren.[63] Neben allgemeinen Empfehlungen wie z. B. die Verwendung von aussagekr?ftigen Titeln, eindeutigen Statuscodes und den sorgsamen Umgang mit Noindex-Direktiven gibt es im Hinblick auf JavaScript noch spezifischere Empfehlungen, welche helfen k?nnen, dass JavaScript-Webanwendungen optimal via Suchmaschinenoptimierung aufgefunden werden k?nnen. Dazu z?hlen serverseitiges Pre-Rendering oder der Verzicht von Fragmenten bei Links. Für das Debugging von JavaScript & SEO gibt es eine Reihe von offiziellen Empfehlungen seitens Google, um nachprüfen zu k?nnen, wie der Googlebot Webinhalte erfasst.[64]

Commons: JavaScript – Sammlung von Bildern, Videos und Audiodateien
Wikibooks: Websiteentwicklung: JavaScript – Lern- und Lehrmaterialien
Wiktionary: JavaScript – Bedeutungserkl?rungen, Wortherkunft, Synonyme, übersetzungen

Spezifikationen

[Bearbeiten | Quelltext bearbeiten]

Dokumentationen

[Bearbeiten | Quelltext bearbeiten]

Einzelnachweise

[Bearbeiten | Quelltext bearbeiten]
  1. ECMAScript? 2023 Language Specification. In: www.ecma-international.org. Ecma International, Juni 2023, abgerufen am 27. Juli 2023 (englisch).
  2. Stefan Koch: JavaScript. Einführung, Programmierung und Referenz – inklusive Ajax. 5. Auflage. dpunkt.verlag, Heidelberg 2009, ISBN 978-3-89864-594-2, überblick, S. 5–17 (457 S.).
  3. a b Olaf G?llner: JavaScript für Mikrocontroller. In: heise online. Verlag Heinz Heise, 13. August 2013, abgerufen am 27. Juli 2016.
  4. a b Olaf G?llner: Tessel: JavaScript-Entwicklerboard fürs ?Internet der Dinge“. In: heise online. Verlag Heinz Heise, 15. August 2013, abgerufen am 27. Juli 2016.
  5. Stefan Koch: JavaScript. Einführung, Programmierung und Referenz – inklusive Ajax. 5. Auflage. dpunkt.verlag, Heidelberg 2009, ISBN 978-3-89864-594-2, JavaScript im Browser, S. 137–156 (457 S.).
  6. Jens Ihlenfeld: Node – strikt ereignisorientierter Javascript-Server. In: Golem.de. 24. November 2009, abgerufen am 27. Juli 2016.
  7. Steve Champeon: JavaScript: How Did We Get Here? In: Web DevCenter. O’Reilly, 6. April 2001, archiviert vom Original (nicht mehr online verfügbar) am 19. Juli 2016; abgerufen am 27. Juli 2016 (englisch).
  8. Chris Mills: A Short History of JavaScript. In: Web Education Community Group Wiki. W3C, 27. Juli 2012, abgerufen am 27. Juli 2016 (englisch).
  9. Auskunft zur Marke JAVASCRIPT im Register des Deutschen Patent- und Markenamtes (DPMA)
  10. Ingo Pakalski: 15 Jahre WWW: Die Browserkriege. Der erste Browserkrieg zwingt Netscape in die Knie. In: Golem.de. 1. Mai 2008, abgerufen am 27. Juli 2016.
  11. Klaus-Peter Kerbusk: Mi?brauch des Monopols. In: Der Spiegel. Nr. 44, 1997 (online).
  12. Scripting for the Java Platform. In: Java SE Documentation. Oracle, abgerufen am 24. Oktober 2012 (englisch).
  13. Florian Scholz, Eric Shepherd: New in JavaScript 1.3. In: Mozilla Developer Network. Mozilla Foundation, 20. Januar 2016, archiviert vom Original am 28. Juli 2016; abgerufen am 27. Juli 2016 (englisch).
  14. Florian Scholz, Eric Shepherd: New in JavaScript 1.4. In: Mozilla Developer Network. Mozilla Foundation, 20. Januar 2016, archiviert vom Original (nicht mehr online verfügbar) am 28. Juli 2016; abgerufen am 27. Juli 2016 (englisch).  Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gem?? Anleitung und entferne dann diesen Hinweis.@1@2Vorlage:Webachiv/IABot/developer.mozilla.org
  15. New Features in this Release. In: DevEdge Online Documentation. Netscape Communications Corporation, 29. Oktober 1998, archiviert vom Original (nicht mehr online verfügbar) am 2. August 2004; abgerufen am 27. Juli 2016 (englisch).
  16. Florian Scholz, Eric Shepherd: New in JavaScript 1.5. In: Mozilla Developer Network. Mozilla Foundation, ehemals im Original (nicht mehr online verfügbar); abgerufen am 20. Januar 2016 (englisch).@1@2Vorlage:Toter Link/developer.mozilla.org (Seite nicht mehr abrufbar. Suche in Webarchiven)
  17. Wladimir Palant, SylvainPasche, Nickolay Ponomarev, Florian Scholz, Eric Shepherd: New in JavaScript 1.6. In: Mozilla Developer Network. Mozilla Foundation, 4. April 2016, archiviert vom Original (nicht mehr online verfügbar) am 5. September 2015; abgerufen am 27. Juli 2016 (englisch).  Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gem?? Anleitung und entferne dann diesen Hinweis.@1@2Vorlage:Webachiv/IABot/developer.mozilla.org
  18. Florian Scholz, James Herdman, Eric Shepherd, Robert Sedov?ek, David Bruant, Leo Balter, Jonathan Watt, Eli Grey, Nickolay Ponomarev, Martin Honnen, Evan Prodromou: New in JavaScript 1.7. In: Mozilla Developer Network. Mozilla Foundation, 21. Oktober 2015, archiviert vom Original (nicht mehr online verfügbar) am 28. Juli 2016; abgerufen am 27. Juli 2016 (englisch).  Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gem?? Anleitung und entferne dann diesen Hinweis.@1@2Vorlage:Webachiv/IABot/developer.mozilla.org
  19. Florian Scholz, Eli Grey, Leandro Mercês Xavier, Nickolay Ponomarev: New in JavaScript 1.8. In: Mozilla Developer Network. Mozilla Foundation, 20. Januar 2016, archiviert vom Original (nicht mehr online verfügbar) am 28. Juli 2016; abgerufen am 27. Juli 2016 (englisch).  Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gem?? Anleitung und entferne dann diesen Hinweis.@1@2Vorlage:Webachiv/IABot/developer.mozilla.org
  20. John Resig: Versions of JavaScript. In: johnresig.com/. 22. April 2008, abgerufen am 8. Juni 2020 (englisch).
  21. ECMAScript 2022 Language Specification. Juni 2022, abgerufen am 22. Juli 2022 (englisch).
  22. Julia Schmidt: Standard für ECMAScript soll j?hrlich Updates erhalten. In: heise Developer. 23. Januar 2015, abgerufen am 22. Oktober 2015.
  23. tc39/ecma262. In: GitHub. Abgerufen am 2. Januar 2017.
  24. Changes to JavaScript, Part 1: EcmaScript 5
  25. ECMAScript 2015 Language Specification. Abgerufen am 2. Januar 2017 (englisch).
  26. ECMAScript 2016 Language Specification. 7. Auflage. Emca International, Genf (englisch, 586 S., ecma-international.org [PDF]). ECMAScript 2016 Language Specification (Memento vom 12. April 2015 im Internet Archive)
  27. ECMAScript 6 compatibility table. In: kangax.github.io. Archiviert vom Original (nicht mehr online verfügbar) am 27. Juli 2016; abgerufen am 2. Januar 2017 (englisch).  Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gem?? Anleitung und entferne dann diesen Hinweis.@1@2Vorlage:Webachiv/IABot/kangax.github.io
  28. Nicholas C. Zakas: Professional JavaScript for Web Developers. John Wiley & Sons., 2011, ISBN 978-1-118-02669-4 (englisch, 960 S.).
  29. siehe englische WP
  30. ECMAScript 2017 Language Specification. Juni 2017, abgerufen am 5. Dezember 2017 (englisch).
  31. JavaScript-Standard ECMAScript 2016 offiziell verabschiedet. In: heise online. heise Developer, 17. Juni 2016, abgerufen am 3. Januar 2017.
  32. a b ECMAScript Next compatibility table. In: kangax.github.io. Abgerufen am 2. Januar 2017.
  33. ECMAScript 2017 Language Specification. Ecma International, Juni 2017, abgerufen am 4. August 2017 (englisch).
  34. Christian Liebel: Evolution im Web: ECMAScript 2017. heise Developer, 1. August 2017, abgerufen am 4. August 2017.
  35. ECMAScript 2017. In: Exploring ES2016 and ES2017. 22. M?rz 2017, abgerufen am 4. August 2017 (englisch).
  36. JavaScript-Standard ECMAScript 2018 offiziell verabschiedet heise.de, am 28. Juni 2018
  37. Tracking ECMAScript Proposals. In: TC39. Ecma, abgerufen am 4. August 2017 (englisch).
  38. ECMAScript 2019: Neun Neuerungen für den JavaScript-Sprachstandard. In: heise online. heise online, 4. Februar 2019, abgerufen am 17. April 2020.
  39. JavaScript: Die Features für ECMAScript 2020 stehen fest. In: heise online. heise online, 6. April 2020, abgerufen am 19. Juni 2020.
  40. JavaScript 2021: Schwache Referenzen, beliebige Versprechen und neue Zuweisungen. In: heise online. heise online, 24. Juli 2020, abgerufen am 27. September 2021.
  41. ECMAScript? 2022 Language Specification
  42. Proposals included in the incoming ECMAScript 2022 standard for JavaScript. In: geek culture. geek culture, 2. September 2021, abgerufen am 27. September 2021.
  43. W3C Working Draft 24 September 2015. In: w3.org. Abgerufen am 28. Juli 2016.
  44. Ilja Zaglov: TypeScript: Microsoft’s neue JavaScript Erweiterung. In: t3n Magazin. 10. Oktober 2012, abgerufen am 10. Oktober 2012.
  45. JavaScript/Objekte/Array. In: SELFHTML. 15. Juli 2016, abgerufen am 27. Juli 2016.
  46. for…in MDN
  47. Object.defineProperty() MDN
  48. for…of MDN
  49. JavaScript/Variable/let im SELFHTML-Wiki
  50. JavaScript/Variable/const im SELFHTML-Wiki
  51. Juriy Kangax Zaytsev: Named function expressions demystified. In: kangax.github.io. 17. Juni 2009, abgerufen am 28. Juli 2016 (englisch).
  52. a b ECMAScript Language Specification – ECMA-262 Edition 5.1. In: ecma-international.org. Abgerufen am 28. Juli 2016. (ecma-international.org (PDF) PDF).
  53. Englische Wikipedia: Role-oriented programming
  54. Traits for Javascript, 2010.
  55. CocktailJS – Annotations. Traits. Talents. April 2013.
  56. Angus Croll, A fresh look at JavaScript Mixins vom 31. Mai 2011.
  57. Die vielen Talente von JavaScript Rollen-orientierte Programmierans?tze wie Traits und Mixins verallgemeinern zu k?nnen. peterseliger.blogspot.de; 5. Juni 2014.
  58. JavaScript Stack Trace API in Google V8 Wiki, Stand 28. Juni 2010, abgerufen am 23. Februar 2013
  59. JavaScript Core Reference: Error (Memento vom 4. November 2014 im Internet Archive) in Aptana HTML Reference, Stand 2. Juli 2012, abgerufen am 23. Februar 2013
  60. Tom DuPont: Report Unhandled Errors from JavaScript. 13. April 2013, abgerufen am 16. April 2013 (englisch, Fehlerprotokollierung mit Stacktrace in JavaScript).
  61. Nico Reed: What is the error object? (Memento vom 31. M?rz 2013 im Internet Archive) In: Nodejitsu Documentation, Stand 26. August 2011, abgerufen am 23. Februar 2013.
  62. Stefan Koch: JavaScript. Einführung, Programmierung und Referenz – inklusive Ajax. 5. Auflage. dpunkt.verlag, Heidelberg 2009, ISBN 978-3-89864-594-2, Ajax, S. 333–355 (457 S.).
  63. Grundlagen von JavaScript-SEO | Google Search Central. Abgerufen am 7. Dezember 2020.
  64. Web developer tools for debugging JavaScript issues in Google Search. Abgerufen am 7. Dezember 2020 (englisch).
少一个睾丸有什么影响 高密度脂蛋白偏低是什么意思 复诊是什么意思 什么叫有气质 特首是什么意思
头不舒服去医院挂什么科 血糖高适合吃什么主食 瘦马什么意思 鼻塞一直不好什么原因 拉肚子什么原因造成的
左耳嗡嗡响吃什么药 对偶是什么意思 无后为大的前一句是什么 掉头发挂什么科 紫苏有什么作用
3月11日什么星座 udv女鞋是什么牌子 血癌是什么原因造成的 壁虎为什么是五毒之一 6月13日是什么日子
吃什么最容易消化hcv8jop0ns1r.cn FAN英语什么意思hcv9jop2ns7r.cn c反应蛋白是什么意思hcv8jop7ns5r.cn 为什么会晨勃hcv8jop5ns9r.cn 15年婚姻是什么婚hcv8jop9ns2r.cn
一什么天空hcv7jop9ns2r.cn 丁毒豆泡酒能治什么病hcv8jop0ns0r.cn 附耳是什么意思hcv9jop7ns2r.cn 失眠吃什么hcv8jop3ns2r.cn 肝血管瘤挂什么科520myf.com
一什么椅子bjhyzcsm.com 身高别体重是什么意思hcv8jop7ns8r.cn x射线是什么hcv8jop7ns7r.cn 医院康复科是干什么的hcv8jop9ns6r.cn 植株是什么意思hcv7jop6ns6r.cn
梦见白发是什么意思hcv7jop9ns5r.cn 罗贯中和施耐庵是什么关系hcv8jop2ns8r.cn 脑膜炎是什么原因引起的hcv9jop4ns3r.cn 风湿属于什么科hcv8jop6ns0r.cn 小孩腰疼是什么原因hcv9jop4ns6r.cn
百度