JavaScript 中的有限状态机,第 2 部分: 实现组件
2010-09-14 13:20:54 来源:WEB开发网用 HTML 元素的 attachEvent 方法注册的函数不会成为这个元素的方法。当鼠标事件发生时,浏览器会调用它们,但是内置的 this 变量将指向全局的 window 对象,而不是 HTML 元素,所以函数不能通过 HTML 元素中保存的指针找到它们的 FadingTooltip 对象。
幸运的是,匿名函数定义位于对象构造方法的 htmlElement 参数的词法范围内。只需在匿名函数定义中使用 htmlElement 变量,就可以用这些函数封闭它。这称为函数闭包(function closure):当在另一个函数内定义一个函数时,如果内部函数使用外部函数的局部变量,JavaScript 就会用内部函数的定义保存这些变量。这样的话,当外部函数返回之后,在调用内部函数时,外部函数的局部变量仍然是可用的。
在这里,当构造方法返回之后,JavaScript 仍然保留 htmlElement 变量的值,所以当浏览器调用匿名函数时,匿名函数仍然可以使用这个变量。这使它们能够找到它们的 HTML 元素并通过指针引用它们的 FadingTooltip 对象,而不需要浏览器的帮助。
因为函数闭包是 JavaScript 语言的一项特性,所以它们在使用 W3C 事件模型的浏览器中一样是有效的。可以利用这个特性将构造方法的 htmlElement 参数值封闭在前一节定义的匿名函数中,而不使用内置的 this 变量。
在老式浏览器中连接鼠标事件
对于既不支持 W3C 事件模型,也不支持 Internet Explorer 事件模型的老式浏览器,必须使用 Netscape Navigator 早期版本提供的原始事件模型来连接事件。所有流行的浏览器都支持它,而且 Web 设计人员广泛使用它在 Web 页面上建立动画;但是对于实现更复杂的应用程序,这是最后的选择,因为它不能链接多个事件处理器。为此,需要将以前注册的事件函数的指针封闭在自己的事件函数定义中,然后在调用自己的 handleEvent 方法之后调用它们,见清单 5。
Tags:JavaScript 有限 状态
编辑录入:爽爽 [复制链接] [打 印]更多精彩
赞助商链接