JavaScript执行从函数声明开始而不是$(document).ready()?

时间:2012-08-22 22:19:25

标签: javascript jquery oop function

我正在尝试为动态下拉菜单编写脚本,以此来学习OOP javascript和jQuery。您可以在www.industrialMerchants.com/industrialMerchants看到虚拟网站。该脚本可在www.industrialMerchants.com/industrialMerchants/javascript/horizontalDropMenu2.js

找到

该脚本首先定义了许多对象,然后我有一个带有闭包的$(document).ready(),用于启动将相关jQuery对象和DOM元素包装到我的对象模型中的过程。

问题是,当我加载静态html文档作为虚拟网站时,Firebug给了我以下错误:

"TypeError: jqObject is undefined."

错误指向以下函数的第五行。

function Menu(jqObject) {
    self = this;
    this.self = jqObject;
    this.submenus = (function(){
        jqObject.children().children("ul").each(function() { <<--- Error
            submenu = new Submenu($(this), self);
            submenus.push(submenu);
            return submenus;
        });
    }());
}

调用该函数的行在这里:

$(document).ready(function(){ 
     menus = new Array();
     $("ul.horizontalDropMenu").each(function(){
         menu = new Menu($(this));
         menus.push(menu);
     });
 });

正如您所看到的,对Menu()对象构造函数的调用包括对jQuery对象的引用作为参数,以便明确定义jqObject。那是什么给出了什么?

当我在从$(document).ready()声明开始的代码中插入断点时,执行完全跳过它,并从函数声明本身开始。就好像浏览器在对它们进行任何显式调用之前尝试执行函数声明一样。

1 个答案:

答案 0 :(得分:3)

设置一个断点并向上调用堆栈给我这一行(.ready之外 - 但这没关系):

Submenu.prototype = new Menu();

您正在创建一个菜单实例,而不是一个jQuery对象,而是使用undefined