2016-06-17 15 views
2

私は依存性注入モジュールを作成しました。デフォルトのパラメータで発見したハックを使用します。 function (x = SomeDependency) {}。 SomeDependencyは定義されていませんが、そのtoStringを解析できます(クラスコンストラクター、矢印関数、および簡潔なオブジェクトメソッドと同じです)。ブラウザではサポートされていません。ノードでのみサポートされます。JavaScriptの引数が遅延評価されていますか?

私の質問:引数が遅延評価されているかどうかに関するドキュメントは見つかりませんでしたが、これに関する仕様書がありますか?または、これは単に定義されていない動作ですか?

更新:

私は何をやっていることは関数を呼び出した後、(上記の例のように)未定義のデフォルトパラメータを使用して、そして彼らが何であるかを見つけるために関数/クラスののtoStringを解析していますか、注入された引数でクラスを新しくする。

+0

「評価済み」はどういう意味ですか?括弧内の実際の式は、@naomikが示すように、関数が呼び出される前に完全に評価されなければなりません。 JSエンジン自体が怠惰な評価をしているのではないかと思うかもしれませんが、関数に引数を使用していないときと使用しないときに違いはありますか?今私は、私はそれに答えることはできません。 –

+0

"関数/クラスのtoStringを手動で解析しています...": – naomik

+0

naomik:あなたは他の選択肢がありますか:P私はすべての耳ですか?私は心から全体に同意します: – user3654410

答えて

1

に渡される前にfoobarが最初に評価されているためです

は遅延評価の引数はありますか?

いいえ、JavaScriptのすべてが熱心に評価されます(論理オペランドの短絡評価が間違っている場合)。

特に、パラメータのデフォルトの初期化子は、パラメータが使用されるときに評価されず、関数が呼び出されたときに熱心に評価されます。ただし、条件付きで評価されます。引数がundefinedの場合は、if句のようになります。

これに関する仕様書はありますか?

はい、JavaScriptの評価順序は、ECMAScript標準(現在の改訂版:http://www.ecma-international.org/ecma-262/7.0/)で指定されています。 hardly any undefined behaviourがあります。

4

JavaScriptの引数は怠け者ですか?

号JavaScriptがこれは、あなたが"foo""bar"は前ログに表示されますあまりにも

var foo =()=> (console.log('foo'), 'foo'); 
 
var bar =()=> (console.log('bar'), 'bar'); 
 
var bof = (a,b)=> console.log('bof',a,b); 
 

 
bof(foo(), bar());

お知らせをテストすることは非常に簡単です

applicative order評価を使用していますbof評価される。引数はbof

+0

私はあなたの答えをもっと編集しているのを見ています。興味深いショーです。;) –

+1

@AurelBílý私は短い答えを最初に出し、再読した後、いくつかの点を広げて – naomik

+0

ちょうど興味深い: 'console.log'の印刷順序は、呼び出し順序と同じであることが保証されていますか?とにかくスタックスニペットの場合はおそらく... –

関連する問題