関数を呼び出せなくても、関数呼び出しの引数部分の式が評価されるのはなぜですか?

モリッツ

一見奇妙に見えるJavaScriptの動作を発見し、それに特定の理由があるかどうか疑問に思いました。

関数呼び出しnull(console.log('test'))はエラーをスローしますが、ログもスローしますtestこの式は、関数を呼び出すことができることが明確になった後でのみ評価されるべきではありませんか?

引数部分の式が関数名の前に評価されるのではないかと思いました。しかし、のような関数呼び出し(console.log(1))(console.log(2))は確かに拳1記録します2

ShadowRanger

一般に、動的言語では、オブジェクトが呼び出し可能かどうかを判断する方法は、オブジェクトを呼び出すことです。そして、引数が評価されるまで、それを行うことは許可されていません。

確かに、そのようなキーワードのnull場合、呼び出し可能ではないことが事前にわかっていますが、それは珍しいケースです。ほとんどの場合、呼び出すことができる場合とできない場合がある変数をロードしています。呼び出し不可能な定数を呼び出そうとする試みをチェックするためのインタープリターの特別なケーシングは、慣用的なコードで発生してはならない場合には無意味であり、次のような単純なケースを処理しません。

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

他の唯一の解決策は、おそらく呼び出し可能が評価された時点で呼び出し可能性を事前にチェックすることですが、それはインタープリターを遅くする追加のチェックを追加するだけで、病理学的コードでのみ実現される小さな利点のためにすべてのコードを遅くします。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

なぜPythonは、呼び出されたときではなく、定義されたときに関数の引数を評価するのですか?

分類Dev

引数のない関数呼び出しがより速く実行されるのはなぜですか?

分類Dev

呼び出し元の関数の変数を呼び出された関数に認識させる方法(関数の引数としてではなく)

分類Dev

F#関数が呼び出される前に評価されるのはなぜですか?

分類Dev

「マクロ」を使用せずに、評価なしで関数呼び出しの引数を出力する

分類Dev

Luaのこの関数が1つの追加の引数で呼び出されるのはなぜですか?

分類Dev

最初の関数呼び出しが他のすべての順次呼び出しより2倍速く実行されるのはなぜですか?

分類Dev

関数呼び出しで何も変更されていないのに、なぜ関数は2つの異なる値を返すのですか?

分類Dev

割り当て解除関数が2つではなく1つの引数で呼び出されるのはなぜですか?

分類Dev

関数を呼び出せないのはなぜですか?

分類Dev

clojurescriptが「-」を使用して一部のjs関数を呼び出し、他の関数を呼び出さないのはなぜですか?

分類Dev

Reactで関数が2回呼び出されるのはなぜですか?

分類Dev

表示関数が2回呼び出されるのはなぜですか?

分類Dev

短絡評価によって関数が呼び出されなくなる可能性がある場合のgcc警告フラグはありますか?

分類Dev

与えられた引数リストで次の関数を呼び出せないのはなぜですか?

分類Dev

Reduce内の関数呼び出し内で評価される省略記号引数を渡す

分類Dev

すぐに呼び出される関数式をすぐに呼び出さなければならないのはなぜですか?

分類Dev

コードを関数として呼び出す方が、Clozure Common lispで直接呼び出すよりも時間がかかるのはなぜですか?

分類Dev

modが式で関数呼び出しとは異なる結果を与えるのはなぜですか?

分類Dev

関数を直接呼び出すよりも、goプラグインを介して関数を呼び出す方が速いのはなぜですか

分類Dev

この関数が呼び出されないのはなぜですか?

分類Dev

Bash関数でgetoptsを使用すると、2番目の呼び出しで引数が無視されるのはなぜですか?

分類Dev

Ncurses-関数呼び出しに複数の引数が存在するのに、mvprintw()を使用して文字列を出力しないのはなぜですか?

分類Dev

JSXでJavaScript関数を呼び出す:()なしで関数を呼び出すのはなぜですか?

分類Dev

別の関数を呼び出すたびに<null>が表示されるのはなぜですか?

分類Dev

「-c」引数を指定して呼び出されたときにurxvtcがzsh関数にアクセスしないのはなぜですか?

分類Dev

SetIntervalで関数が呼び出されないのはなぜですか?

分類Dev

javascript関数がdivで呼び出されないのはなぜですか?

分類Dev

makefileがこの関数を呼び出さないのはなぜですか?

Related 関連記事

  1. 1

    なぜPythonは、呼び出されたときではなく、定義されたときに関数の引数を評価するのですか?

  2. 2

    引数のない関数呼び出しがより速く実行されるのはなぜですか?

  3. 3

    呼び出し元の関数の変数を呼び出された関数に認識させる方法(関数の引数としてではなく)

  4. 4

    F#関数が呼び出される前に評価されるのはなぜですか?

  5. 5

    「マクロ」を使用せずに、評価なしで関数呼び出しの引数を出力する

  6. 6

    Luaのこの関数が1つの追加の引数で呼び出されるのはなぜですか?

  7. 7

    最初の関数呼び出しが他のすべての順次呼び出しより2倍速く実行されるのはなぜですか?

  8. 8

    関数呼び出しで何も変更されていないのに、なぜ関数は2つの異なる値を返すのですか?

  9. 9

    割り当て解除関数が2つではなく1つの引数で呼び出されるのはなぜですか?

  10. 10

    関数を呼び出せないのはなぜですか?

  11. 11

    clojurescriptが「-」を使用して一部のjs関数を呼び出し、他の関数を呼び出さないのはなぜですか?

  12. 12

    Reactで関数が2回呼び出されるのはなぜですか?

  13. 13

    表示関数が2回呼び出されるのはなぜですか?

  14. 14

    短絡評価によって関数が呼び出されなくなる可能性がある場合のgcc警告フラグはありますか?

  15. 15

    与えられた引数リストで次の関数を呼び出せないのはなぜですか?

  16. 16

    Reduce内の関数呼び出し内で評価される省略記号引数を渡す

  17. 17

    すぐに呼び出される関数式をすぐに呼び出さなければならないのはなぜですか?

  18. 18

    コードを関数として呼び出す方が、Clozure Common lispで直接呼び出すよりも時間がかかるのはなぜですか?

  19. 19

    modが式で関数呼び出しとは異なる結果を与えるのはなぜですか?

  20. 20

    関数を直接呼び出すよりも、goプラグインを介して関数を呼び出す方が速いのはなぜですか

  21. 21

    この関数が呼び出されないのはなぜですか?

  22. 22

    Bash関数でgetoptsを使用すると、2番目の呼び出しで引数が無視されるのはなぜですか?

  23. 23

    Ncurses-関数呼び出しに複数の引数が存在するのに、mvprintw()を使用して文字列を出力しないのはなぜですか?

  24. 24

    JSXでJavaScript関数を呼び出す:()なしで関数を呼び出すのはなぜですか?

  25. 25

    別の関数を呼び出すたびに<null>が表示されるのはなぜですか?

  26. 26

    「-c」引数を指定して呼び出されたときにurxvtcがzsh関数にアクセスしないのはなぜですか?

  27. 27

    SetIntervalで関数が呼び出されないのはなぜですか?

  28. 28

    javascript関数がdivで呼び出されないのはなぜですか?

  29. 29

    makefileがこの関数を呼び出さないのはなぜですか?

ホットタグ

アーカイブ