Я обнаружил некоторые, казалось бы, странное поведение JavaScript и задавался вопросом, есть ли для этого конкретная причина:
Вызов функции null(console.log('test'))
выдает ошибку, но также и test
журнала. Разве это выражение не должно оцениваться только после того, как ясно, что эту функцию можно вызвать?
Я подумал, что возможно, что выражение в части аргумента оценивается перед именем функции. Но вызов функции like (console.log(1))(console.log(2))
действительно будет записывать кулак 1
затем 2
.
В общем, на динамическом языке способ определения того, является ли объект вызываемым, - это его вызов. И вам не разрешено это делать, пока аргументы не будут оценены.
Конечно, для ключевого слова, такого как null
оно заранее известно, что оно не будет вызываемым, но это необычный случай; большую часть времени вы загружаете переменную, которая может или не может быть вызвана; специальная оболочка интерпретатора для проверки попыток вызова не вызываемых констант бессмысленна, если это не должно происходить в идиоматическом коде и не будет обрабатывать простой случай, например:
var foo = null;
foo(console.log(1));
Единственным другим решением является предварительная проверка на возможность вызова в момент оценки возможного вызова, но это просто добавление дополнительных проверок, которые замедляют работу интерпретатора, замедляя весь код за крошечное преимущество, которое реализуется только в патологическом коде.