尽管 targetArray
并不是在函数包围的上下文中定义的,但是可以将上下文定义为参数传递给 Dojo 函数。这意味着 this
关键字可以访问在该上下文中声明的任何对象(包括函数)。清单 11 显示了正确的实现(注意,增加的代码用粗体表示)。
dojo.declare( "myClass", null, { targetArray: null, constructor: function(source) { // Initialise in constructor to avoid making global this.targetArray = []; // Copy each element from source into target... dojo.forEach(source, function(item) { this.targetArray[this.targetArray.length] = item; }, this); }, } ); |
上下文并不总是作为 Dojo 函数签名中的相同参数传递的:
在 dojo.subscribe 中,上下文是在函数声明之前传递的(参见清单 12)。
在 dojo.connect 中,应该分别提供定义 trigger 方法和 target 方法的上下文。清单 13 展示了一个例子,其中 obj1 定义 methodA 的上下文,而 obj2 定义 methodB 的上下文。对 obj1 调用 methodA 将导致对 obj2 调用 methodB。
清单 12. 在 dojo.subscribe 中设置上下文
dojo.declare( "myClass", null, { subscribe : function() { dojo.subscribe("publication", this, function(pub) { this.handlePublication(pub); }); }, handlePublication : function(pub) { console.log("Received: " + pub); } } ); |
清单 13. 在 dojo.connect 中设置上下文
dojo.connect(obj1, "methodA", obj2, "methodB"); |
已习惯构化 Java 代码环境的开发人员将很难适应 JavaScript。但是 Dojo 提供了类声明功能,使向客户端开发过渡变得非常简单。充分理解上下文,以及何时、如何设置上下文,将为 Java 开发人员省去很多麻烦,并帮助他们自信地将 JavaScript 添加到自己的工具箱中。
责任编辑:小草