【问题标题】:JavaScript: Using same name for class/function and object?JavaScript:对类/函数和对象使用相同的名称?
【发布时间】:2012-07-13 15:27:17
【问题描述】:

我看过here 并且基本上(据我所知)你不能为函数和对象使用相同的名称,但是看看下面的代码,情况似乎并非如此.谁能告诉我这是如何工作的?

;(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 在它的声明中引用了它自己。这不会导致无限递归吗?

【问题讨论】:

  • 超级鱼减速?荒谬。
  • 你说得对,没有什么能减慢超级鱼的速度!

标签: javascript class object recursion naming


【解决方案1】:

它不是递归,因为它没有调用自己。 它引用了对象的属性。

如果你看到这样的东西:

var sf = $.fn.superfish(),

会有问题。 :)

【讨论】:

  • 这只是我的想法,sf 引用了 superfish()。 sf 定义了 superfish() 使用的属性。在定义 superfish() 需要的属性之前,它如何引用 superfish()? 'var sf = $.fn.superfish;' 的行为是否创建一个“空白”$.fn.superfish 对象?
  • 属性赋值给对象后调用。
【解决方案2】:

这是一种常用技术,允许您存储对某些深度嵌套属性的引用并使用它来代替,以提高可读性和性能。 Crockford's article 相关。

// 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 并不关心。

This fiddle 演示了您遇到问题的确切 JavaScript 功能。这就是javascript的工作方式。并不是说我会将此功能作为范式基础,但这是可能的。

【讨论】:

  • 尽管我仍在尝试了解如何对对象进行引用,即使对象本身需要使用 sf 引用定义的属性。就像“先有蛋的先有鸡?”。还是我完全误解了它?
  • 对象的内存在被引用后被留出。这留下了占位符。然后这些占位符被填写。如果您在定义对象之前尝试使用对象,您会在空变量所在的位置看到“未定义”。
  • 谢谢。我想我只需要接受这样一个事实,即可以通过对尚未定义的对象的引用来定义嵌套属性。我想我会在角落里哭一会儿。
  • @Nate 为您添加了一个 jsfiddle 示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-16
  • 1970-01-01
  • 2016-01-04
  • 2019-09-14
  • 1970-01-01
  • 2014-02-01
相关资源
最近更新 更多