Почему я получаю неожиданный токен "(" в следующем скрипте? - PullRequest
3 голосов
/ 25 января 2012

Хорошо, я знаю, что я делаю, и я намеренно хочу, чтобы на моей странице было много таких сценариев, как это, потому что эти сценарии не должны оцениваться при загрузке, однако если я установлю type = "что-то еще", то я не получайте осмысленность и проверку, что создает проблемы при разработке.

<script type="text/javascript" id="s">
{
    //                <- following '(' is unexpected
    update: function (o){
        alert(o);
    }
}
</script>

Однако, когда я делаю это, все в порядке,

<script type="text/javascript" id="s">
{
    update: function x(o){
        alert(o);
    }
}
</script>

Обратите внимание на «х» перед круглыми скобками. Проблема в том, что если я пишу «x», то для этого метода устанавливается window.x, а написание нескольких скриптов создает еще большую проблему.

Когда я изменяю его на

<script type="text/javascript" id="s">
{
    update: function x(o){
        alert("s-update: " + o);
    },
    method: function x(y){
        alert("s-method: " + y);
    }
}
</script>

Затем я получаю неожиданный токен ',' до method.

  1. Я хочу знать, как я могу создать только нотацию объектов JavaScript, которая будет выполняться позже с помощью идентификаторов. См. Рабочий код на http://jsfiddle.net/MDJbT/,, но я получаю ошибку сценария, если я включаю ,, и если я удаляю ,, тогда я не получаю ошибку сценария, но мой код не выполняется, http://jsfiddle.net/2ykdD/1/.
  2. Мне нужно это в среде, которая позволит нам писать сценарии полностью независимым от id образом, чтобы не было никакого конфликта глобальных методов. Оба скрипта имеют одинаковые имена, но разную логику. Единственная разница - это «id», я знаю, какой ID ссылаться и какой метод вызывать.
  3. Это очень маленькая часть сложной среды, в которой идентификаторы автоматически назначаются, а методы являются частью иерархии классов, которая динамически устанавливается во время выполнения, сохраняя область.
  4. Я не хочу, чтобы эти сценарии выполнялись вообще.
  5. Я хочу, чтобы эти сценарии были написаны таким образом, чтобы Visual Studio и другие редакторы точно отображали intellisense и выдавали ошибки о синтаксисе и т. Д.
  6. Я буду выполнять эти сценарии только в отношении действий, вызываемых пользователем в рамках eval, предоставляя дополнительные аргументы метода.

Ответы [ 4 ]

5 голосов
/ 25 января 2012

Javascript хочет намекнуть, что { ... } является выражением:

 ({
    update: function x(o){
        alert("s-update: " + o);
    },
    method: function x(y){
        alert("s-method: " + y);
    }
})
2 голосов
/ 25 января 2012

{ указывает начало блока в JavaScript, что видно из следующего фрагмента кода (который является допустимым синтаксисом):

{ var hello = "test" } 

Внутренне это переводится в следующую последовательность (помня, что объявления переменных подняты, а не ограничены областью блока):

  1. Определить переменную hello
  2. начать блок, ограниченный {
  3. assignзначение «тест» до Hello
  4. конечный блок

Игнорирование блока эквивалентно var hello = "test".Если мы применим ту же логику к вашему коду, то

{
    //                <- following '(' is unexpected
    update: function (o){
        alert(o);
    }
}

преобразуется в следующую последовательность:

  1. блок начала, ограниченный {
  2. defineметка обновление
  3. оператор начала функции
  4. ошибка синтаксиса выброса

Игнорирование разделителей блоков, код интерпретируетсяas:

update: function (o){
    alert(o);
}

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

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

2 голосов
/ 25 января 2012

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

Третий недействителен, потому что оператор списка неуместен (который , интерпретируется как в этом случае).

2 голосов
/ 25 января 2012
<script type="text/javascript" id="s">
({
    update: function(o){
        alert("j-update: " + o);
    },
    method: function(y){
        alert("j-method: " + y);
    }
})
</script>

http://jsfiddle.net/MDJbT/1/

...