3

В некоторых случаях наличие нескольких функций самозапуска в одном файле JavaScript вызывает ошибку. Получение второй функции для возврата значения предотвращает ошибку.Ошибка с несколькими самозапускающимися функциями в одном скрипте: случай для точки с запятой

У меня есть баребоны HTML файл ...

<script src="two.js"></script> 
<script src="one.js"></script> 

... с помощью этих скриптов:

// two.js 
(function() { 
    console.log('1/2') 
})() 

(function() { 
    console.log('2/2') 
})() 

// one.js 
(function() { 
    console.log('1/1') 
})() 

Когда я открываю файл в Chrome, я получить этот выход:

1/2 two.js:2 
Uncaught TypeError: undefined is not a function two.js:6 
1/1 

Другие браузеры жалуются по-своему. Другими словами, наличие двух самозапускающихся функций в одном скрипте вызывает проблему. Наличие одной самозапускаемой функции для каждого сценария отлично работает. Если я прокомментирую второй скрипт функции two.js, нет проблем.

Однако, если я получу вторую функцию, чтобы вернуть значение, то также нет проблем. Все работает отлично, если я изменю two.js к этому:

(function() { 
    console.log('1/2') 
})() 

foo = (function() { 
    console.log('2/2') 
    return 'bar' 
})() 

Почему первая версия сбой и второй успех?

+0

Вы забыли точки с запятой. – elclanrs

ответ

5

Вы забыли запятую:

(function() { 
    console.log('1/2') 
})(); 

(function() { 
    console.log('2/2') 
})(); 

В противном случае возвращается значение предыдущего выражения (undefined) пытается выполнить следующее выражение. Очевидно, undefined не является функцией.

В semicolonless JavaScript мира, вы часто будете видеть точку с запятой перед каким-либо сырое выражение, например, ():

;(function(){}()) 
;['1','2','3'].map(Number) 

JavaScript will attempt to fill in the semicolons вы «забыли», но эти выражения являются неоднозначными, так что вам нужно, чтобы добавить его ,

+0

Но когда я выполняю их вместе в файле, я не вижу эту ошибку. Зачем? – thefourtheye

2

Вам не хватает точек с запятой в конце выражений функции, поэтому выражаемое в скобках выражение обрабатывается как вызов функции. Поскольку функция не возвращает значение (возвращаемое значение неявно undefined), код функционально эквивалентен undefined() - следовательно, ошибка.

Мораль истории - Не забудьте о запятой!

+0

Ну, теперь ... Это первый раз, когда я столкнулся с реальной потребностью в точках с запятой. Вы абсолютно правы: добавление одной точки с запятой в нужное место решает проблему. –

+0

@JamesNewton Существуют и другие ситуации, в которых точки с запятой необходимы для правильной работы кода. Как хорошее правило, всегда лучше использовать точки с запятой на всякий случай. – 0x499602D2