一見奇妙に見えるJavaScriptの動作を発見し、それに特定の理由があるかどうか疑問に思いました。
関数呼び出しnull(console.log('test'))
はエラーをスローしますが、ログもスローしますtest
。この式は、関数を呼び出すことができることが明確になった後でのみ評価されるべきではありませんか?
引数部分の式が関数名の前に評価されるのではないかと思いました。しかし、のような関数呼び出し(console.log(1))(console.log(2))
は確かに拳1
を記録します2
。
一般に、動的言語では、オブジェクトが呼び出し可能かどうかを判断する方法は、オブジェクトを呼び出すことです。そして、引数が評価されるまで、それを行うことは許可されていません。
確かに、そのようなキーワードのnull
場合、呼び出し可能ではないことが事前にわかっていますが、それは珍しいケースです。ほとんどの場合、呼び出すことができる場合とできない場合がある変数をロードしています。呼び出し不可能な定数を呼び出そうとする試みをチェックするためのインタープリターの特別なケーシングは、慣用的なコードで発生してはならない場合には無意味であり、次のような単純なケースを処理しません。
var foo = null;
foo(console.log(1));
他の唯一の解決策は、おそらく呼び出し可能が評価された時点で呼び出し可能性を事前にチェックすることですが、それはインタープリターを遅くする追加のチェックを追加するだけで、病理学的コードでのみ実現される小さな利点のためにすべてのコードを遅くします。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加