Другие языки программирования и технологии

Javascript function - со скобками и без скобок?

Сломал уже себе всю свою голову и вынес весь мозг пытаясь твердо разобраться - когда использовать function в Javascript со скобками (например, doSomething() ) и когда - без скобок ( просто doSomething ). - Читаю книги, смотрю видеоуроки - только путаница в этом вопросе. - Или на самом деле в этом вопросе - полная путаница?
Открою вам тайну. В JavaScript практически всё является функцией. Это объектно-ориентированный язык. А все объекты создаются функцией-конструктором. Весь код выполняется в рамках глобального объекта window, который также создан функцией-конструктором. Если функция не является конструктором, то она является методом того объекта, в котором объявлена. Функцию объявленная как объект:
// var Example = new Function();
Объект можно объявить с помощью функции-конструктора:
function Example(param) { this.param = param || null; }
Функции можно объявлять как методы, используя прототипирование:
Example.prototype.get = function() { return this.param; }
Example.prototype.set = function(param) { this.param = param; }
Можно объявить переменную и присвоить ей функцию:
var echo = function (obj) { if (obj == undefined) obj = ""; console.log(obj); }
Функцию можно вызвать:
echo("Hello World!");
Можно создать объект
var example = new Example();
Вызвать его методы:
example.set("Hello World!");
var text = example.get();
echo(text);
window.echo(text );
Последняя запись показывает на то, что свойства и методы можно добавлять в объект в любое время, придерживаясь определённых правил, связанных с ограничением на совпадение имён.
Функцию можно передавать в другую функцию в виде параметров двумя способами.
Первый: как идентификатор, но в этом случае нельзя передать параметры. Читайте выше про setTimeout
Второй, как строку:
var param = "Hello World!";
doSomething(value) { echo(value); }
setTimeout("doSomething(param)", 1000);
Функцию можно подписать на событие:
function hello() { echo("Hello World!"); }
var ini = function () {
var myId = document.getElmentById("myId ");
myId.onclick = hello; // теперь после клика по элементу с id myId будет вызвана функция hello
}
window.onload = ini; // после события загрузки окна будет вызвана функция ini
И, соответственно, ничто не мешает объявлять одну функцию внутри другой, любым известным способом. Тут, главное, не запутаться в области видимости.
Так как все свойства и методы объектов можно представить в виде пары ключ-значение, то и обращаться к ним через ключ можно двумя способами. как к идентификатору и как к строке. Второй способ используется только в том случае, если ключ содержит пробел. Но не возбраняется обратиться и как к строке. Ещё эту особенность можно использовать когда генерировать ключи во время выполнения программы.
Поэтому конструкция:
example["get"]; // имеет право на жизнь
var obj = { "hello world": "Hello World!" };
echo(obj["hello world"]); // А вот по-другому никак
Владислав Давыденко
Владислав Давыденко
87 410
Лучший ответ
если параметров нет, то и скобки не нужны
без же не работает, как можно без них использовать ?
аа подумал - понял есть одно место где можно передавать имя фугнкции без скобок: это там когда ты передаешь обьект типа function в качестве параметра например setTimeout(doSomething, 100 ) - вот так функция setTimeout сама поймет что ей передали имя функции которую нужно выполнить через 100 секунд, а если ты из любого другого места скрипта хочешь вызвать какую то функцию с параметрами или без то ты должен указать скобки чтобы яваскрипт компилятор понимал что это не переменная а функция
Hикто Никто
Hикто Никто
59 848
Без скобок
Дима Китоов
Дима Китоов
2 390
в обоих случаях работает как знаю, хотя для совместимости лучше указывай скобки
Ярослав Сёмин
Ярослав Сёмин
1 066
пишу в консоли хрома
var obj = {
func:function(){
console.log('hello');
}
};

после чего пробую вызвать сначала:

obj.func (соответственно выводит полностью анонимную функцию как она записана)

потом:

obj["func"] (снова выводит полностью анонимную функцию как она записана)

и, наконец:

obj.func() (соответственно выводит результат выполнения анонимной функции)

и вот как это понимать? - я же во 2-м случае обратился к свойству объекта, ключом которого являетcя func без скобок! - как эти скобки "перенеслись" с определения функции на ее алиас? - бог с ним с кривостью ЯП, но закономерность ведь хочется уловить...
Спасибо, "Николай Веселуха". - Ваш ответ - самый содержательный. - У меня по нему всего 4 комментария:
- "В JavaScript практически всё является функцией. " - я полагал - наоборот: почти все в JS является объектом, в том числе и функция (и массив туда же) .
- "все объекты создаются функцией-конструктором" - необязательно: можно (и в подавляющем случае так и делают) создавать объекты и через литерал (почти как JSON notation).
- "Весь код выполняется в рамках глобального объекта window" - NodeJS понятия не имеет о конкретных Web API Interfaces (таких, как Window и Document, например) , если ему не дать соответствующий референс.
- Но самое главное: для меня так и осталось загадкой: если одно из свойств объекта определено через функцию, - почему я не могу ВЫЗВАТЬ эту функцию просто указав объект и ключ свойства (как "dot notation", например, без скобок) ? - ведь это вроде бы по правилам? - этому я так и не нашел пока объяснения. - Получается: передать анонимную функцию через ее ключ без скобок в виде параметра я почти всегда могу, передать именованную функцию со скобками - всегда могу, а чтобы ее вызвать - я должен добавить скобки к ее ключу? - Ну, если она - анонимная, - то скобки после ключа еще понятны, а если она - именованная, - зачем подменять имя функции с помощью переменной, которой она присвоена, да еще и скобки городить?
Всё равно.