【问题标题】:JavaScript execution beginning at function declarations rather than $(document).ready()?JavaScript 从函数声明而不是 $(document).ready() 开始执行?
【发布时间】:2012-08-18 09:54:44
【问题描述】:

我正在尝试为动态下拉菜单编写脚本,作为学习 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() 声明开始的代码中时,执行会完全跳过它,并从函数声明本身开始。就好像浏览器在对它们进行任何显式调用之前尝试执行函数声明。

【问题讨论】:

  • 你为什么要设置this.this
  • 不确定发生了什么,但您几乎可以肯定应该使用var 声明“自我”。与其他功能中的“菜单”和“菜单”相同。
  • 你在哪里看到的,Blender?

标签: javascript jquery oop function


【解决方案1】:

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

Submenu.prototype = new Menu();

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

【讨论】:

  • Submenu.prototype = Object.create(Menu.prototype); 进行修复。
  • 不幸的是,修复只是揭示了更多问题。是时候回到绘图板了。我显然还不够了解 OOP javascript。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多