2014-01-07 2 views
0

Хотелось бы получить информацию об этом. При написании Javascript, я привык к созданию таких функций, как это:Javascript; функции, созданные путем назначения переменной?

function firstThing() { 
    console.log("first"); 
}; 

Я следовал учебник, и увидел эту установку. Используя назначение переменной, а затем передавая анонимную функцию, которая затем ... становится именем функции. Есть ли причина, по которой это будет использоваться вместо «традиционного» способа выше?

var secondThing = function() { 
    console.log("second"); 
}; 

Назвав их одно и то же:

firstThing() 
secondThing() 

ответ

3

Это называется функция выражение:

var foo = function() {} 

и это объявление функции:

function foo() {} 

Основным отличием является то, что функция декларации «взвалил». За кулисами объявление функции «поднимается» вверху своей области и присваивается имени переменной - фактически так же, как выражение функции.

Рассмотрим это:

foo(); //logs 'abc' 
function() { 
    console.log('abc'); 
} 

Это работает хорошо, потому что foo будет поднят. С выражением функции, это не получится:

foo(); //foo is not defined! 
var foo = function() { 
    console.log('abc'); 
} 

Одна вещь, которая является удивительным о функциональных выражений, которые можно присвоить свое значение с IIFE (Сразу Вызывается функция Expression) и имеют собственные значения и функции, как это:

var myFunc = (function() { 
    function thisWillBeMyFunc() { 
    doOne(); 
    doTwo(); 
    doThree(); 
    } 

    function doOne() { 
    console.log('Action 1!'); 
    } 
    function doTwo() { 
    console.log('Action 2!'); 
    } 
    function doThree() { 
    console.log('Action 3!'); 
    } 

    return thisWillBeMyFunc; 
}()); 

myFunc(); //logs the actions 

doOne(); //error - not defined! 

Live demo (click).

о, прекрасная мощь и гибкость JavaScript!

+0

Я помню, что однажды прочитал замечательную статью, но в этот момент я не могу найти ничего лучше, чем http://dmitrysosikov.com/ecmascript/chapter-2-variable-object/#entering-the-execution-context - - и на самом деле он утверждает, что я ошибаюсь. Кажется, я смутил что-то хммммммм. И это странно, потому что я читал эту статью, которую не могу найти, - это было сильное различие между этими двумя шагами. Итак, да, похоже, это ** IS ** hoisting, и я давно думал неправильно: -S – zerkms

+0

Я знаю, что это было отмечено как дубликат, но я ценю обсуждение/примеры. Просто для удовольствия: http://jsfiddle.net/8UTFD/3/ http://jsfiddle.net/8UTFD/4/ –

1

Существует еще одно различие. Первый создает именованную функцию, второй - создает анонимную функцию.

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

Некоторые дополнительные ссылки here и here.

+0

Каков ваш предпочтительный метод (ы) для просмотра трассировки стека в Javascript? –

Смежные вопросы