Javascript, функции против переменных

Я начинаю заглядывать в Javascript и JQuery (следовательно, мой выбор из примера ниже). И я обнаружил, что могу определить функцию и назвать ее (как и ожидалось), но я тоже мог бы просто.. Сделать что-то еще.. И что вопрос:

function $() {
    console.log('hi');
}

$()
$

Я не получаю сообщение об ошибке с вызовом функции или просто указывая "$" без вызова функции. Что на самом деле делает последнее? И почему он работает, если он фактически не вызывает функцию?

Ответ 1

Объект JavaScript - это сопоставление между ключами и значениями. Ключи строки и значения могут быть любыми. Это делает объекты естественными для хэшмапов.

Функции - это обычные объекты с дополнительной способностью быть отозваны.

FROM https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#.22Normal.22_objects.2C_and_functions

Это означает, что вы можете делать такие вещи, как:

function test(){
   console.log(1);
}

var a = test;

a();

или

var test2 = function(){
  console.log(2);
}

или autocall

//sorry for the indentation.
(
  function(){
     console.log(3);
  }
)()

Или создать структуры

var testHash = {
   a : 1,
   b : function(){
      console.log(4);
   }
}

testHash.b();

testHash['b']();

И создать функцию, которую трудно вызвать:

//in a browser environment
window['test3'] = function(){
   console.log(5);
} 

window['test space'] = function(){
   console.log(6);
} 

test3() //no error
test space() //error :D

EDIT: Пользователь хочет узнать больше о функциях автозапуска:

Почему эта работа?

(
  function(){
     console.log(3);
  }
)()

Легко следовать в 2 этапа:

Скобка, если мы знаем, что функция похожа на другие переменные, и мы знаем, что скобки предназначены только для сделанных групп или функций вызова.

var test_1 = 'string example';
var length = (test_1).length; // the same that test_1.length

Имеет смысл в:

var test_1 = 'string';
var test_2 = ' example';
var length = (test_1 + test_2).length; // the same that test_1.length

вместо:

var test_1 = 'string';
var test_2 = ' example';
var aux = test_1 + test_2;
var length = aux.length; // the same that test_1.length

Теперь, это имеет смысл для вас?:

var length = ('string example').length; // instead the first example

Второй шаг, мы можем изменить строку для функции.. и называть ее

( function(){ ... } )()

почему это интересно? Ну, теперь появилась концепция закрытия.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures

Закрытие является очень важным инструментом в javascript.

Ответ 2

Он ничего не делает. Это просто переменная, которая выполняет функцию.

Он не отличается от следующего одинаково бесполезного кода:

42;

Ответ 3

имя "$" является только держателем функции, делая строку "$", это просто список содержимого кода (в инструменте разработчика Google Chrome).

$() - вызов функции.

$указывает, что он держит.