Почему выражения в аргументной части вызова функции оцениваются, даже если функция не может быть вызвана?

1

Я обнаружил некоторые, казалось бы, странное поведение JavaScript и задавался вопросом, есть ли для этого конкретная причина:

Вызов функции null(console.log('test')) выдает ошибку, но также и test журнала. Разве это выражение не должно оцениваться только после того, как ясно, что эту функцию можно вызвать?

Я подумал, что возможно, что выражение в части аргумента оценивается перед именем функции. Но вызов функции like (console.log(1))(console.log(2)) действительно будет записывать кулак 1 затем 2.

  • 2
    Порядок оценки изложен в спецификации языка. Вызовы функций говорят, что сначала выполняется вычисление MemberExpression (вещь перед параметрами), затем аргументы, а затем функция.
Теги:

1 ответ

2
Лучший ответ

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

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

var foo = null;
foo(console.log(1));

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню