2012-02-22 4 views
2

Можно создать дубликат:
JavaScript: var functionName = function() {} vs function functionName() {}декларирования JavaScript частных методов

В Javascript, "частные методы" в основном только внутренние функции. Но на протяжении различных яваскрипта учебники доступны в Интернете, кажется, есть две практики для объявляющих частных методов:

function foo() 
{ 
    var privateMethod = function() { } 
} 

против ...

function foo() 
{ 
    function privateMethod() { } 
} 

Они оба, кажется, добиться того же эффекта, т.е. privateMethod является недоступны публично через экземпляр foo. Единственная разница, по-видимому, с первым путем (с использованием ключевого слова var), privateMethod доступна только для кода, который приходит после декларации. Но со вторым способом privateMethod доступен для всего кода в пределах foo. Итак, есть ли другая разница, которая делает любой из этих двух методов предпочтительнее?

ответ

1

Есть еще одно существенное отличие: в первом примере функция is anonymous. Переменная, которой она назначена, имеет имя, но сама функция этого не делает. Это имеет значение, когда вы используете отладчик и просматриваете списки точек останова, стек вызовов и т. Д.

Еще одно существенное отличие состоит в том, что первое выражение, которое называется выражением функции, происходит с того момента, когда точка выполнения достигает той части кода, что означает, что вы можете назначить различные функции переменной в зависимости от логического потока, если хотите. Второй, который называется объявлением функции , действителен только на верхнем уровне его сдерживающей области (не в блоке if, try/catch и т. Д.) И происходит, когда в процессе выполнения входит, который содержит область действия (до выполняется пошаговый код).

Вы могли бы также быть соблазн объединить два, используя имя функции выражения:

var foo = function foo() { ... }; 

... но, к сожалению, хотя он должен быть действительными, различные JavaScript двигателей (в первую очередь от Microsoft) handle those incorrectly ,

+0

http://jsfiddle.net/cJHCL/ противоречит второй части вашего заявления для меня в Chrome –

+0

@ Александр Павлов: Chrome просто терпит недопустимый синтаксис; см. разделы [12] (http://es5.github.com/#x12) (в частности, большое «ПРИМЕЧАНИЕ»), [13] (http://es5.github.com/#x13) и [10.5] (http://es5.github.com/#x10.5) спецификации. Попробуйте в Firefox, который следует букве закона. Но в Chrome, вот еще несколько интересных случаев и примеры того, почему вы этого не делаете: http://jsfiddle.net/cJHCL/1/ http://jsfiddle.net/cJHCL/2/ –

+0

Абсолютно, это большой, не делай этого, просто указывая, что он работает на Chrome (v8, на самом деле.) OTOH, JS позволяет такие вещи, как 'if (foo) {var value = val1; } else {var value = val2;/* или вообще опустить это, чтобы получить «неопределенный» в значении * /} ', что также несколько запутывает. –

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