Страницы

Поиск по вопросам

вторник, 28 января 2020 г.

Анонимные функции в js - c ними или без них?

#веб_программирование #javascript


До сегодняшнего дня я считал, что js код нужно устраивать так - 
file.js
var a = 10; // какое-то свойство

/**
 * Class - то, что я называю классом,
 * объект которого я буду создавать и 
 * работать с его методами и свойствами.
 */
var Class = function(){

};

Но сегодня я увидел вариант с анонимной функцией -
file.js 
(function(){
    var a = 10;

    var Class = function(){

    };
})

И сразу я вспомнил, что такое исполнение уже видел, и у меня появился вопрос: а как
более правильно? И в чем отличия, если они есть?    


Ответы

Ответ 1



Важно отметить, что в JavaScript`е (ECMA) не существует так называемых классов, и всякая сущность представляет собой объект. Существует 3 способа создания объектов: Используя функцию в качестве инстанции: function someFunction (prop) { this.prop = prop; ... } var object = new someFunction ('property'); Используя литеральный способ: var object = { prop: "property", } Используя анонимные функции (лямбда) var object = new function() { this.type = "property"; } Наиболее часто используется именно первый способ. Так же стоит учитывать, что в первом случае: var a = 10; // какое-то свойство var Class = function(){}; У Вас переменная "a", в глобальной области видимости, а во втором нет. Отсюда возникает идеологический вопрос в необходимости|отсутствии сокрытии данных (инкапсуляции).

Ответ 2



Делается, чтобы логически отделить модуль. Чтобы избежать конфликта переменных или их подмены. Чтобы сделать себе пространство имен. Чтобы не засорять глобальное пространство. Часто плагины в такую конструкцию заворачивают. Кстати, такая функция должна вызываться на месте, т.е. у вас не хватает двух скобок в конце. Получается так: (function () { var a = 'Hello!'; var Class = this.Class = function () { this.method = function () { alert(a); } }; })(); q = new Class; q.method(); При этом 'a' не видна снаружи.

Ответ 3



Отличие есть. Если немного переписать ваш второй пример: (function(){ var a = 10; var Class = function(){ }; }()) // скобочки добавил то мы имеем самовызывающиюся функцию, которая, следуя из названия, выполнится сразу, как до нее дойдет очередь. Используются такие конструкции для инкапсуляции вашего кода (переменные a и Class не будут видны за пределами этой анонимной функции). Также различают function expression и function declaration. Анонимные функции играют большую роль в javascript (к примеру, callback-функции, которые будут реагировать на разные события).

Комментариев нет:

Отправить комментарий