Користувач:Luver/JS

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку
JavaScript
Парадигма імперативна, елементи функціональної, об'єктно-орієнтована (прототип-орієнтована)
Дата появи 1995
Творці Брендан Айк
Розробник Netscape Communications Corporation, Mozilla Foundation
Останній реліз 1.8.5[1] (22 березня 2011)
Тестова версія (27 липня 2010)
Система типізації динамічна, качина
Основні реалізації KJS, Rhino, SpiderMonkey, V8, Carakan, Chakra (Microsoft)
Під впливом від Scheme, Self, Java, C, Python
Вплинула на ActionScript, CoffeeScript, Dart, JScript .NET, Objective-J, QML, TypeScript, Node.js, LiveScript
JavaScript
Розширення файлу: .js
MIME-тип: application/javascript
text/javascript (застаріла)[2]
Узагальнений ідентифікатор типу: com.netscape.javascript-source[3]
Тип формату: текстовий файл

JavaScript (JS) — динамічна, об'єктно-орієнтованa[4] мова програмування. Реалізація стандарту ECMAScript. Найчастіше використовується як частина браузера, що надає можливість коду на стороні клієнта (такому, що виконується на пристрої кінцевого користувача) взаємодіяти з користувачем, керувати браузером, асинхронно обмінюватися даними з сервером, змінювати структуру та зовнішній вигляд веб-сторінки. Мова JavaScript також використовується для програмування на стороні серверу (подібно до таких мов програмування, як Java і C#), розробки ігор, стаціонарних та мобільних додатків, сценаріїв в прикладному ПЗ (наприклад, в програмах зі складу Adobe Creative Suite), всередині PDF-документів тощо.

JavaScript класифікують як прототипну (підмножина об'єктно-орієнтованої), скриптову мову програмування з динамічною типізацією. Окрім прототипної, JavaScript також частково підтримує інші парадигми програмування (імперативну та частково функціональну) і деякі відповідні архітектурні властивості, зокрема: динамічна та слабка типізація, автоматичне керування пам'яттю, прототипне наслідування, функції як об'єкти першого класу.

Незважаючи на схожість назв, мови Java та JavaScript є двома різними мовами, що мають відмінну семантику, хоча й мають схожі риси в стандартних бібліотеках та правилах іменування. Синтаксис обох мов отриманний «в спадок» від мови С, але семантика та дизайн JavaScript є результатом впливу мов Self та Scheme.[5]

Історія

[ред. | ред. код]

Поява в Netscape

[ред. | ред. код]

В 1995 році компанія Netscape поставила завдання вбудувати мову програмування Scheme чи «якусь схожу» в браузер Netscape. Для цього був запрошений Брендан Айк, американський розробник, що спеціалізувався на системному програмуванні. Також, для прискорення розробки, Netscape почали співробітництво з компанією Sun Microsystems.

З часом, концепція розроблюваної мови програмування була розширена до можливості використання безпосередньо в HTML-коді сторінки. Компанії мали на меті створити мову, що могла зв'язати різні частини веб-сайтів: зображень, Java-аплетів, об'єктної моделі документа. Ця мова повинна була стати зручною для веб-дизайнерів та некваліфікованих програмістів. Робочою назвою нової мови була Mocha, яка була змінена на LiveScript в перших двох бета-версіях браузера Netscape 2.0. А дещо пізніше, користуючись популярністю бренду Java, LiveScript був перейменований на JavaScript і третя бета-версія (2.0B3) Netscape 2.0 вже вийшла з сучасною назвою[6][7]. Для цього була придбана відповідна ліцензія у компанії Sun Microsystems, що володіла брендом Java.

В 1992 році компанією Nombas була розроблена скриптова мова програмування Cmm (англ. С-minus-minus, гра слів навколо мови С++), яка пізніше була перейменована на ScriptEase та могла вбудовуватися в веб-сторінки. Існує хибна думка, що JavaScript був створений під впливом Cmm. Насправді, Брендан Айк ніколи не чув про Cmm до того, як він створив LiveScript[8]. Пізніше, Nombas зупинили розробку Cmm та почали використовувати JavaScript, а згодом, приймали участь в групі зі стандартизації JavaScript.

Стандартизація

[ред. | ред. код]

В листопаді 1996 року, Netscape заявила, що відправила JavaScript в організацію Ecma International для розгляд мови як промислового стандарту. В результаті подальшої роботи з'явилась стандартизована мова з назвою ECMAScript. В червні 1997 року, Ecma International опублікувала першу редакцію специфікації ECMA-262. Рік по тому, в червні 1998 року, щоб адаптувати специфікацію до стандарту ISO/IEC-16262, були внесені деякі зміни і випущена друга редакція. Третя редакція побачила світ в грудні 1999 року.[9]

Четверта версія стандарту ECMAScript так і не була закінчена і четверта редакція не вийшла[10]. Тим не менш, п'ята редакція з'явилася в грудні 2009 року.

На сьогодні, актуальна версія стандарту — 5.1. Вона була випущена в червні 2011 року.[11]

Актуальний стан

[ред. | ред. код]

JavaScript, наразі, є однією з найпопулярніших мов програмування в інтернеті. Але спочатку багато професіональних програмістів скептично ставилися до мови, цільова аудиторія якої складалася з програмістів-любителів[12]. Поява AJAX змінила ситуацію та повернула увагу професійної спільноти до мови. В результаті, були розроблені та покращені багато практик використання на JavaScript (зокрема, тестування та налагодження), створені бібліотеки та фреймворки, поширилося використання JavaScript поза браузером.

Торгова марка

[ред. | ред. код]

Можливості

[ред. | ред. код]

Структурне програмування та область видимості

[ред. | ред. код]

Як спадок від мови С, що дала JavaScript базовий синтаксис, JavaScript значною мірою підтримує структурне програмування (блоки if, цикли while, конструкції switch тощо) та відрізняє поняття виразу (англ. expression) та інструкції (англ. statement). Лише частково, починаючи з версії мови 1.7, JavaScript підтримує блочну область видимості (англ. block scoping), за допомогою ключового слова let. Основна модель області видимості — функційна область видимості (англ. function scoping).

Динамічність

[ред. | ред. код]

Оскільки JavaScript є скриптовою мовою, то має деякі загальні особливості таких мов: динамічна типізація та «інтепретація на ходу» (має функцію eval). Змінні в JavaScript не прив'язані до типу даних, натомість прив'язані значення. Наприклад, змінна x може зберігате ціле число, а потім використана для зберігання масиву рядків (string). Тип змінної визначається інтепретатором динамічно, за допомогою різних методів, зокрема, качиної типізації.[13]

Все в JavaScript є об'єктами (окрім деяких спеціальних типів). Об'єкти динамічні, їх поля яких можуть бути створені, змінені та видалені під час виконання програми. Об'єкти представляють з себе асоціативні масиви: назви полів (та методів) є рядками-ключами, а самі поля можуть бути ітеровані за допомогою циклу for...in. Доступ до полів здійснюється двома шляхами: через точку (obj.10) та по ключовому рядку (obj['x'] = 10).

// Створення об'єкту
var obj = {foo: 123}; 
// Доступ до поля через масив
obj['foo'] = "Value"; 
// Доступ до поля через точку
obj.foo = "New value"; 
// Видалення поля
delete obj.foo; 

// Ітерація по об’єкту
for (var fieldName in obj) { 
   // Вивід назв та значень полів
   console.log(fieldName, obj[fieldName]); 
}

Функції як об'єкти першого класу

[ред. | ред. код]

Функції є об'єктами першого класу в JavaScript. І як будь-який об'єкт вони мають поля та методи (наприклад, .call() та .bind()). Якщо функція визначена всередині іншої функції, то вона називається вкладеною. Вкладені функції як об'єкти створюються кожен виклик зовнішньої функції. Можливість створювати вкладені функції забезпечує основну модель області видимості в JavaScript. При кожному створенні функція створює так зване лексичне замикання: область видимості зовнішньої функції (включаючи константи, локальні змінні та значення аргументів) становиться частиною внутрішнього стану створеної функції, навіть після завершення виконання зовнішньої.

// Зовнішня функція
function outer(firstArgument, secondArgument) { 
    // Локальна змінна в зовнішній функції
    var foo = "345"; 
    // Визначення внутрішньої функції
    function inner() {
        console.log(firstArgument, secondArgument, foo);
    }
    // Виклик внутрішньої функції
    inner();
}
outer("1", "2"); // Тут створюється екземпляр функції inner. В консолі: 1 2 345
outer("0", "5");  // Тут створюється ще один екземпляр функції inner. В консолі: 0 5 345

Prototype-based

[ред. | ред. код]
Prototypes
JavaScript uses prototypes where many other object oriented languages use classes for inheritance.[14] It is possible to simulate many class-based features with prototypes in JavaScript.[15]
Functions as object constructors
Functions double as object constructors along with their typical role. Prefixing a function call with new will create an instance of a prototype, inheriting properties and methods from the constructor (including properties from the Object prototype).[16] ECMAScript 5 offers the Object.create method, allowing explicit creation of an instance without automatically inheriting from the Object prototype (older environments can assign the prototype to null).[17] The constructor's prototype property determines the object used for the new object's internal prototype. New methods can be added by modifying the prototype of the object used as a constructor. JavaScript's built-in constructors, such as Array or Object, also have prototypes that can be modified. While it is possible to modify the Object prototype, it is generally considered bad practice because most objects in JavaScript will inherit methods and properties from the Object prototype and they may not expect the prototype to be modified.[18]
Functions as methods
Unlike many object-oriented languages, there is no distinction between a function definition and a method definition. Rather, the distinction occurs during function calling; when a function is called as a method of an object, the function's local this keyword is bound to that object for that invocation.

Implicit and explicit delegation

[ред. | ред. код]

JavaScript is a delegation language.

Functions as Roles (Traits and Mixins)
JavaScript natively supports various function based implementations of Role[19] patterns like Traits[20][21] and Mixins.[22][23] Such a function defines additional behavior by at least one method bound to the this keyword within its function body. A Role then has to be delegated explicitly via call or apply to objects that need to feature additional behavior that is not shared via the prototype chain.
Object Composition and Inheritance
Whereas explicit function based delegation does cover composition in JavaScript, implicit delegation already happens every time the prototype chain is walked in order to e.g. find a method that might be related to but is not directly owned by an object. Once the method is found it gets called within this object's context. Thus inheritance in JavaScript is covered by a delegation automatism that is bound to the prototype property of constructor functions.

Miscellaneous

[ред. | ред. код]
Run-time environment
JavaScript typically relies on a run-time environment (e.g. a web browser) to provide objects and methods by which scripts can interact with the environment (e.g. a webpage DOM). It also relies on the run-time environment to provide the ability to include/import scripts (e.g. HTML <script> elements). This is not a language feature per se, but it is common in most JavaScript implementations.
Variadic functions
An indefinite number of parameters can be passed to a function. The function can access them through formal parameters and also through the local arguments object. Variadic functions can also be created by using the apply method.
Array and object literals
Like many scripting languages, arrays and objects (associative arrays in other languages) can each be created with a succinct shortcut syntax. In fact, these literals form the basis of the JSON data format.
Regular expressions
JavaScript also supports regular expressions in a manner similar to Perl, which provide a concise and powerful syntax for text manipulation that is more sophisticated than the built-in string functions.[24]

Vendor-specific extensions

[ред. | ред. код]

JavaScript is officially managed by Mozilla Foundation, and new language features are added periodically. However, only some JavaScript engines support these new features:

  • property getter and setter functions (supported by WebKit, Opera,[25] ActionScript, and Rhino)[26]
  • conditional catch clauses
  • iterator protocol (adopted from Python)
  • shallow generators-coroutines (adopted from Python)
  • array comprehensions and generator expressions (adopted from Python)
  • proper block scope via the let keyword
  • array and object destructuring (limited form of pattern matching)
  • concise function expressions (function(args) expr)
  • ECMAScript for XML (E4X), an extension that adds native XML support to ECMAScript (unsupported in Firefox since version 21[27])

Додати недоліки. З недоліків вийти на те, що люди намагаються компенсувати динаміку статику (звідси розділи про асм.js, use strict та мови, які компілюються в JS: CoffeeScript, Dart, TypeScript)

Додати дебаг та статичний аналіз, як два окремих розділи.

Розділ про Сервер-Сайд — поставити всередину 1.1.

Окрім syntax, описати типи даних. Всередині синтаксису згадати про use strict/

Описати SPApplication

  • 2 Trademark
  • 3 Features
    • 3.1 Imperative and structured
    • 3.2 Dynamic
    • 3.3 Functional
    • 3.4 Prototype-based
    • 3.5 Implicit and Explicit Delegation
    • 3.6 Miscellaneous
    • 3.7 Vendor-specific extensions
  • 4 Technical details
    • 4.1 Типи данних, подробиці виконання.
    • 4.2 Синтаксис
    • бібліотеки та утиліти
    • бібліотеки для тестування
  • 5 Використання на клієнті (в браузері)
    • 5.1 Приклад та базова інформація (зокрема, наявні движки в браузерах) майм-тайп!
    • 5.2 СінгПейджАплікейшн (мотивація, опис, приклади бібліотек, приклади сайтів)
    • букмарклети
    • 5.3 Сумісність (різниця між браузерами та стандартом, різниця між браузерами, сумісність с IE, та, особливо, IE9-)
  • 6 Security
    • 6.1 Cross-site vulnerabilities
      • 6.1.1 Misplaced trust in the client
      • 6.1.2 Browser and plugin coding errors
      • 6.1.3 Sandbox implementation errors
  • 7 Використання на сервері
    • 7.1 Embedded scripting language
    • Окремий розділ про Ноду
    • 7.2 Scripting engine
    • 7.3 Application platform (PhoneGap, Firefox OS, Java Rhino, XUL/Gecko)
    • 7.4 Microcontrollers
  • 8 Development tools
  • 9 Version history
  • 10 Criticisms (та прос енд конс, недоліки динамічної типізації і т. д.)
  • 11 Мови-сателіти (як вирішуються поблеми в Кофі, Дарті та ТайпСкрипті)
  • 11 Related languages and features
    • 11.1 Мови, що залишилися (без сателітів)
    • 11.2 JavaScript and Java (про плутаницю)
  • 12 References
  • 13 Further reading
  • 14 External links
  1. New in JavaScript 1.8.5 | Mozilla Developer Network. Developer.mozilla.org. 18 листопада 2012. Процитовано 26 травня 2013.
  2. RFC 4329. Apps.ietf.org. Процитовано 26 травня 2013.
  3. System-Declared Uniform Type Identifiers. Mac OS X Reference Library. Apple Inc. Процитовано 5 березня 2010.
  4. ECMAScript Language Specification (PDF).
  5. ECMAScript Language Overview (PDF). 23 жовтня 2007. с. 4. Процитовано 3 травня 2009.
  6. Press release announcing JavaScript, «Netscape and Sun announce Javascript», PR Newswire, December 4, 1995
  7. TechVision: Innovators of the Net: Brendan Eich and JavaScript. Web.archive.org. Архів оригіналу за 8 лютого 2008.
  8. Brent Noorda's Answers on ECMA. Quora. Процитовано 13 квітня 2014.
  9. ECMAScript 3rd Edition specification (PDF). Процитовано 26 травня 2013.
  10. Documentation. ECMAScript. Процитовано 13 квітня 2014.
  11. Standard ECMA-262 (PDF). Процитовано 26 травня 2013.
  12. JavaScript: The World's Most Misunderstood Programming Language. Crockford.com. Процитовано 19 травня 2009.
  13. Flanagan та Ferguson, 2006, с. 176—178.
  14. Inheritance and the prototype chain. Mozilla Developer Network. Mozilla. Процитовано 6 April 2013.
  15. Herman, David (2013). Effective Javascript. Addison-Wesley. с. 83. ISBN 9780321812186.
  16. Haverbeke, Marjin (2011). Eloquent Javascript. No Starch Press. с. 95—97. ISBN 9781593272821.
  17. Katz, Yehuda. Understanding "Prototypes" in JavaScript. Процитовано 6 April 2013.
  18. Herman, David (2013). Effective Javascript. Addison-Wesley. с. 125—127. ISBN 9780321812186.
  19. The many talents of JavaScript for generalizing Role Oriented Programming approaches like Traits and Mixins, April 11, 2014.
  20. Traits for Javascript, 2010.
  21. CocktailJS — ANNOTATIONS. TRAITS. TALENTS., April 2013.
  22. Angus Croll, A fresh look at JavaScript Mixins, published May 31, 2011.
  23. JavaScript Code Reuse Patterns, April 19, 2013.
  24. Haverbeke, Marijn (2011). Eloquent JavaScript. No Starch Press. с. 139—149. ISBN 978-1593272821.
  25. Robert Nyman, Getters And Setters With JavaScript — Code Samples And Demos, published 29 May 2009, accessed 2 January 2010.
  26. John Resig, JavaScript Getters and Setters, 18 July 2007, accessed 2 January 2010
  27. E4X - Archive of obsolete content | MDN. Mozilla Developer Network. Mozilla Foundation. Feb 14, 2014. Процитовано 13 July 2014.