0

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

Это работает - явная запятая в качестве разделителя есть (примечание - намеренно в одной строке):

var f1 = function() { console.log(1); }, f2 = function() { console.log(2);}

Это, однако, не похоже на работу, пытаясь его в Chrome консоль (опять же - один вкладыш на цели):

var f5 = function() { console.log(5); } f6 = function() { console.log(6);} 
VM37860:2 Uncaught SyntaxError: Unexpected identifier 
    at Object.InjectedScript._evaluateOn (<anonymous>:895:140) 
    at Object.InjectedScript._evaluateAndWrap (<anonymous>:828:34) 
    at Object.InjectedScript.evaluate (<anonymous>:694:21) 

Тогда это, кажется, работает - уведомление отсутствует запятая:

> var f3 = function() { 
    console.log(3); 
    } 
    f4 = function() { 
    console.log(4); 
    } 
< function f4() 
> f4() 
    4 
< undefined 
> f3() 
    3 
< undefined 

Я ищу объяснение или ссылку на вопрос о том, почему многострочная, но отсутствующая запятая, похоже, работает.

В результате разветвления было то, что отсутствующая запятая в нашем источнике, которая проскользнула в сборку, вызвала неожиданное поведение в синтаксическом правильном комплекте сценариев (фрагмент сценария, содержащий отсутствующую запятую, связан вместе со многими другими компонентами на стороне сервера и выбрасывается как отдельный тег сценария в браузер). То есть Chrome и FF не сообщали о синтаксических ошибках, но поведение скриптов было неправильным (это сложный спа-центр на основе knockout.js, но казалось, что вызывалась неправильная функция из многих функций с таким же именем, но с различной областью; используется нокаут 2.x).

Независимо - мне интересно, может ли кто-нибудь объяснить поведение консоли с чистой точки зрения Javascript/Chrome, вне сферы действия SPA-центра с нокаутом.

ответ

2

Javascript будет использовать точки с запятой в некоторых разрывах строки. Тьфу. Таким образом, ваша вторая переменная была глобальной, а не частью var. http://inimino.org/~inimino/blog/javascript_semicolons

+0

почему! whyyyy! whyyyyyyyyy! :-) –

0

Если вы не используете запятую, это означает «предложение» на той же линии. В другой строке Javascript будет принимать другое предложение. А запятая может использоваться «много переменной».

, например, var f1, f2 ->var f1; var f2; вар f3 = 10 f4 = 20 // это глобальная переменная. это не та же линия. `