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 回答