JavaScript:对类/函数和对象使用相同的名称?

JavaScript:对类/函数和对象使用相同的名称?,javascript,class,object,recursion,naming,Javascript,Class,Object,Recursion,Naming,我已经看过了,基本上(据我所知)函数和对象不能使用相同的名称,但看看下面的代码,情况似乎并非如此。谁能告诉我这是怎么回事 ;(function($){ $.fn.superfish = function(op){ var sf = $.fn.superfish, c = sf.c, $arrow = $(['<span class="',c.arrowClass,'"> &#187;</span&

我已经看过了,基本上(据我所知)函数和对象不能使用相同的名称,但看看下面的代码,情况似乎并非如此。谁能告诉我这是怎么回事

;(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);
;(函数($){
$.fn.superfish=函数(op){
var sf=$.fn.superfish,
c=sf.c,
$arrow=$(['»;'])。连接(''),
...         
};
var sf=$.fn.superfish;
...
sf.c={
bcClass:‘sf面包屑’,
菜单类:“已启用sf js”,
主播班:'sf与ul',
箭头类:“sf子指示器”,
shadowClass:'sf shadow'
};  
...
})(jQuery);

superfish在其声明中有一个自我引用。这不会导致无限递归吗

它不是递归,因为它不调用自己。 它正在引用对象的属性

如果你看到这样的情况:

var sf = $.fn.superfish(),

那样就会有问题了。:)

这是一种常见的技术,允许您存储对某个深度嵌套属性的引用,并使用该引用以提高可读性和性能。是相关的

// 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的工作方式。并不是说我会接受这个特性作为一个范例基础,但这是可能的。荒谬。你的权利,没有任何东西能让superfish慢下来!它就在我的脑海里,是一种特殊的感觉。sf定义superfish()使用的属性。在定义superfish()所需的属性之前,它如何引用superfish()?“var sf=$.fn.superfish;”的行为创建一个“blank”$.fn.superfish对象?将属性分配给该对象后会调用该对象。尽管我仍在试图理解如何对该对象进行引用,即使该对象本身需要使用sf引用定义的属性。这就像“先来的是什么,鸡蛋里的鸡?”。还是我完全误解了它?对象一旦被引用,内存就会被保留下来。这就留下了地方持有者。然后,这些席位持有人将在会议结束后填写。如果您在定义对象之前尝试使用该对象,您会看到空变量所在的位置为“undefined”。谢谢。我想我只能接受这样一个事实:嵌套属性可以通过对尚未定义的对象的引用来定义。“我想我会在角落里哭一会儿。”内特为你添加了一个JSFIDLE示例。