4

私はここを見てきましたが、基本的に(私が知る限り)関数とオブジェクトに同じ名前を使用することはできませんが、次のコードを見ると、そうではないようです. 誰でもこれがどのように機能するか教えてもらえますか?

;(function($){
    $.fn.superfish = function(op){

        var sf = $.fn.superfish,
            c = sf.c,
            $arrow = $(['<span class="',c.arrowClass,'"> &#187;</span>'].join('')),
...         
    };

    var sf = $.fn.superfish;
...
    sf.c = {
        bcClass     : 'sf-breadcrumb',
        menuClass   : 'sf-js-enabled',
        anchorClass : 'sf-with-ul',
        arrowClass  : 'sf-sub-indicator',
        shadowClass : 'sf-shadow'
    };  
...
})(jQuery);

また、superfish はその宣言内で自分自身への参照を持っています。これは無限再帰を引き起こしませんか?

4

2 に答える 2

4

それ自体を呼び出していないため、再帰ではありません。オブジェクトのプロパティを参照しています。

次のようなものを見た場合:

var sf = $.fn.superfish(),

問題が発生するよりも。:)

于 2012-07-13T18:32:02.047 に答える
2

これは、読みやすさとパフォーマンスのために、深くネストされたプロパティへの参照を保存し、代わりにそれを使用できるようにする一般的な手法です。Crockford の記事が関連しています。

// some really deeply nested property
var o = ooo.eee.oo.ah_ah.ting.tang.walla.walla;

// i could type...
ooo.eee.oo.ah_ah.ting.tang.walla.walla.bing = true;

// or just
o.bing = true;

この場合、深くネストされたプロパティはオブジェクト自体ですが、javascript は気にしません。

このフィドルは、問題が発生している正確な JavaScript 機能を示しています。それがJavaScriptの仕組みです。私はこの機能をパラダイムの基盤として受け入れるつもりはありませんが、それは可能です。

于 2012-07-13T19:03:28.857 に答える