Почему использование двоеточия в вызове функции foo:bar() возвращает ReferenceError вместо SyntaxError?

var foo = {
    bar: function() { return ""; }
}; 
foo:bar();

Вышеизложенное приводит к:

Uncaught ReferenceError: полоса не определена

Использование его в этом контексте console.log(foo:bar()); приводит к:

SyntaxError: отсутствует ) после списка аргументов

В некоторых случаях объект/функция двоеточия объекта делает SyntaxError, но в этом случае это не так, почему это так? Я тестировал это как в node.js, так и в паре браузеров, и это поведение было последовательным, поэтому мне было любопытно, что не приведет ни к одной из ошибок в контексте «foo: bar».

Не помню, как еще я добился SyntaxError, но это как-то связано с вызовом функции из объекта с помощью :


person ACSD_    schedule 28.09.2018    source источник
comment
In some cases Было бы неплохо, если бы вы показали оба случая..   -  person Keith    schedule 28.09.2018
comment
спасибо за помощь в редактировании, но ReferenceError возникает в foo:bar SyntaxErrormissing ) после аргумента происходит с console.log(foo:bar());   -  person ACSD_    schedule 28.09.2018
comment
См. stackoverflow.com/questions/9384865/ чтобы узнать больше о синтаксисе двоеточия   -  person gurpreet singh chahal    schedule 28.09.2018
comment
Думаю, вы имели в виду SyntaxError вместо SymbolError (но, возможно, действительно есть какой-то тип ошибки символа, с которым я никогда не сталкивался).   -  person benvc    schedule 28.09.2018
comment
@benvc Я думаю, что где-то видел один парсер JS, который выдавал SymbolError вместо SyntaxError. Однако я не могу вспомнить, где или даже что это было. Это мог быть инструмент, который читает файлы JS и обрабатывает их, но сам по себе не является JS, поэтому SymbolError мог появиться из любого мира программирования, из которого он исходил.   -  person VLAZ    schedule 28.09.2018
comment
я имел в виду SyntaxError, мой мозг просто застрял на том, что я ожидал увидеть на другом языке. его удивительный javascript не различает типы SyntaxError   -  person ACSD_    schedule 28.09.2018


Ответы (1)


Я не уверен, чего вы хотели добиться этим.

Имея его как "foo:bar", он не имеет ничего общего с переменной foo. Вместо этого он объявляет метку с именем ' фу'.

Объявление метки внутри console.log приводит к SyntaxError, поскольку нарушает синтаксический анализ оператора.

С другой стороны, если он без console.log, как вы упомянули, имеет правильный синтаксис: он объявляет метку «foo» и пытается вызвать функцию «bar», которая не существует. Вот почему он показывает ReferenceError.

В любом случае Javascript ожидает, что точка (.) будет обращаться к членам объекта: foo.bar()

person skyboyer    schedule 28.09.2018
comment
спасибо, я работал над lua до этого случайно сделал это. консоль выдает ошибку ссылки на foo:bar(); вместо синтаксической ошибки, и мне было интересно, почему - person ACSD_; 28.09.2018
comment
Я понимаю. Я не был уверен, хотите ли вы просто вызвать метод объекта или сделать что-то более конкретное, например вызов статического члена или что-то еще (это могло быть, если бы вы перешли с другого языка, но я не думал о lua) - person skyboyer; 28.09.2018
comment
в lua object:methodcall() заставляет первым аргументом быть объектом просто привычка, в которой я был, когда различал такие вызовы, как math.floor и car:drive, если бы вы вызвали car.drive здесь, привод был бы совершенно не в курсе конкретного объекта автомобиля - person ACSD_; 28.09.2018