В чем разница между выражением функции и объявлением в JavaScript? [Дубликат]

Вы можете использовать фреймворк с открытым исходным кодом CInject в CodePlex. Вы можете написать минимальный код для создания Инжектора и заставить его быстро перехватить любой код с помощью CInject. Кроме того, поскольку это Open Source, вы также можете расширить его.

Или вы можете следовать шагам, указанным в этой статье, в методах перехвата вызова с использованием IL и создать свой собственный перехватчик с использованием классов Reflection.Emit в C #.

462
задан Community 23 May 2017 в 11:55
поделиться

2 ответа

Первый оператор зависит от контекста, в котором он объявлен.

Если он объявлен в глобальном контексте, он создаст подразумеваемую глобальную переменную с именем «foo», которая будет переменной, указывающей на функцию. Таким образом, вызов функции «foo ()» может быть выполнен в любом месте вашей программы javascript.

Если функция создается в замыкании, она создаст подразумеваемую локальную переменную с именем «foo», которую затем можно использовать для вызова функции внутри замыкания с помощью «foo ()»

РЕДАКТИРОВАТЬ:

Я должен также сказали, что операторы функции (первый) анализируются перед выражениями функций (другие 2). Это означает, что если вы объявите функцию внизу скрипта, вы все равно сможете использовать ее вверху. Выражения функций оцениваются только тогда, когда они попадают в исполняемый код.

END EDIT

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

var foo = function foo() { return 5; }

То же, что

var foo = function fooYou() { return 5; }
12
ответ дан 22 November 2019 в 22:53
поделиться

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

Объявления функций загружаются до выполнения любого кода.

Функциональные выражения загружаются только тогда, когда интерпретатор достигает этой строки кода.

Итак, если вы попытаетесь вызвать выражение функции до его загрузки, вы получите ошибку! Если вместо этого вы вызовете объявление функции, оно будет работать всегда, потому что код не может быть вызван, пока не будут загружены все объявления.

Пример: Выражение функции

alert(foo()); // ERROR! foo wasn't loaded yet
var foo = function() { return 5; } 

Пример: Объявление функции

alert(foo()); // Alerts 5. Declarations are loaded before any code can run.
function foo() { return 5; } 


Что касается второй части вашего вопроса:

var foo = function foo () {return 5; } действительно такой же, как и два других. Просто эта строка кода раньше вызывала ошибку в сафари, но теперь этого не происходит.

398
ответ дан 22 November 2019 в 22:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: