0

我在 JS 中有一个对象,我试图在其中测试反应式框架 在事件订阅中,我想调用定义订阅的封闭类的实例方法,如下所示;

function MyClass()
{
    var DoSomething = function(a,b) { ... }

    var InstanceVariable = 1;

    this.uiEvent = uiDiv.jqueryUiWidget("widget")
        .toObservable("change")
        .Subscribe(
                function (event)
                {
                    // Want to call the instance method in the enclosing class
                    DoSomething(1,2);
                });

    this.uiEvent2 = uiDiv.jqueryUiWidget("widget")
        .toObservable("change")
        .Subscribe(
                function (event)
                {
                    // Want to use the instance variable within here
                    alert(InstanceVariable);  
                });
}

我该怎么做(因为“this”范围是订阅的范围)?在以某种方式设置订阅时,我是否必须通过函数/变量?

如果我尝试这样做,我会在所有浏览器中收到错误消息,指出实例变量或方法不存在:在我要调用实例成员的函数范围内的“this”指的是观察者,所以有OnNext、OnCompleted 等函数

非常感谢,

保罗

4

1 回答 1

1

在我看来,您的代码应该可以工作。如果您有任何问题,我建议您描述它们。但是,如果您要问它是如何工作的,那么您应该了解闭包。来自维基百科:

在计算机科学中,闭包是一个一流的函数,具有绑定在词法环境中的自由变量。这样的函数被称为“封闭”了它的自由变量。闭包是在其自由变量的范围内定义的,这些变量的范围至少与闭包本身的生命周期一样长。闭包的显式使用与函数式编程以及 ML 和 Lisp 等语言相关联。闭包用于实现延续传递风格,并以这种方式隐藏状态。因此,诸如对象和控制结构之类的构造可以用闭包来实现。

这意味着DoSomething并且InstanceVariable可以从定义它们的范围内定义的任何方法访问。每次MyClass调用构造函数时,这些变量都会有一个新的“实例”。

于 2010-12-14T16:27:30.470 回答