2016-03-24 4 views
0

私はJavaScriptを学んでいますが、昨日私は基本的な知識を改めるべきだと思うので、私は「機能」のトピックを選択しました。決して使用されない関数を定義すると、どのような欠点がありますか?

注:私はMozillaからこの文書を読んだとき、私はこれを見たのSpiderMonkey含まないいくつかのJavaScriptエンジンは、誤っ関数定義として名を持つ任意の関数式を扱います。これにより、always-falseのif条件でも、zeroが定義されます。それは安全な方法が、それはこの方法があるわけだを言ったので

if (0) { 
    var zero = function() { 
    document.writeln("This is zero."); 
    } 
} 

だから私の質問は、次のとおりです。条件付きで関数を定義するためのより安全な方法は、匿名関数を定義し、それを変数に割り当てることです安全ではありません:どのような問題がありますか?

ありがとうございます。

答えて

3

varを使用して変数を宣言すると、スコープの上部にhoistedと表示されます。ですから、このようないくつかのコードを記述することが可能になります:someConditionfalseある場合

if (someCondition) { 
    var zero = function zero() { 
    // do stuff 
    }; 
} 
if (zero) { 
    zero(); 
} 

正しく実行すると、zeroは常にundefinedになります。

エンジンが指定された関数式を関数定義として間違って使用すると、それも同様に呼び出されます。はとなり、someConditionもチェックされます。これは、someConditionに関係なく、zeroは「真実」の値を持つことを意味します。

実際に名前付き関数を割り当てていないため、値がundefinedであると予想されるときは、実際には変数と同じ名前の関数に割り当てられます。

+1

ここには何も間違ったことはありませんが、この回答は 'var'スコープに関連していて、SpiderMonkeyが関数式を宣言として誤って誤って解釈しているわけではありません。 –

+0

@DanPrinceそうではありません。関数の宣言がどのように持ち上がるかについての情報を追加したので、定義済みの値は「ゼロ」になります。 –

+0

私はホイスト文書をチェックし、その変数はスコープの先頭に宣言することができます。役に立つリンクのために@MikeCに感謝します。 –

関連する問題