Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
异步JavaScript和对象持久性_Javascript_Oop_Asynchronous_Coding Style - Fatal编程技术网

异步JavaScript和对象持久性

异步JavaScript和对象持久性,javascript,oop,asynchronous,coding-style,Javascript,Oop,Asynchronous,Coding Style,我的JS代码大致如下: function myObject() { this.a = 13; this.fetchData = function() { alert(this.a); getData(this.processData); } this.processData = function(data) { // do stuff with data alert(this.a)

我的JS代码大致如下:

function myObject()
{
    this.a = 13;

    this.fetchData = function()
    {
        alert(this.a);
        getData(this.processData);
    }

    this.processData = function(data)
    {
        // do stuff with data
        alert(this.a);
    }

    this.fetchData();
}

function getData(callback)
{
    // do async request for data and call callback with the result
}
function myObject() {
   var a = 13;

   this.fetchData = function() {
      alert(a);
      getData(this.processData);
   }

   this.processData = function(data) {
      // do stuff with data
      alert(a);
   }

   this.fetchData();
}
我的问题是:函数fetchData可以通过this关键字访问我的a变量,但另一个函数processData在被getData调用时不能访问。我理解为什么会发生这种情况,但不知道如何解决它

您将如何更好地以面向对象的方式处理这个问题?(getData函数必须可用于多个类)

两个选项:

1) 让
getData
接受上下文参数(通常称为
context
thisArg
)并使用
回调。应用(context…)
回调。调用(context…)
来调用它。因此:

function getData(callback, context) {
    // ...when it's time to call it:
    callback.call(context, arg1, arg2);
    // or
    callback.apply(context, [arg1, arg2]);
}
2) 创建一个函数,当调用该函数时,它将返回并调用原始回调,并将
this
设置为正确的值。(这有时称为“绑定”。)

例如,使用显式闭包:

this.fetchData = function()
{
    var self = this;

    alert(this.a);
    getData(getDataCallback);

    function getDataCallback(arg1, arg2) {
        self.processData(arg1, arg2);
    }
}
或者使用一个通用的
bind
函数来完成它(这也会涉及一个闭包,但是在一个良好的受控上下文中,所以它不会关闭您不需要的东西)。有关简单的
bind
函数的示例,请参见下面的链接


更多信息:

我认为您只需要将“a”定义为局部变量,这样它就可以同时处理fetchData和getData,如下所示:

function myObject()
{
    this.a = 13;

    this.fetchData = function()
    {
        alert(this.a);
        getData(this.processData);
    }

    this.processData = function(data)
    {
        // do stuff with data
        alert(this.a);
    }

    this.fetchData();
}

function getData(callback)
{
    // do async request for data and call callback with the result
}
function myObject() {
   var a = 13;

   this.fetchData = function() {
      alert(a);
      getData(this.processData);
   }

   this.processData = function(data) {
      // do stuff with data
      alert(a);
   }

   this.fetchData();
}
你也可以

function myObject() {
   this.a = 13;
   var that = this;

   this.fetchData = function() {
      alert(that.a);
      getData(this.processData);
   }

   this.processData = function(data) {
      // do stuff with data
      alert(that.a);
   }

   this.fetchData();
}

+1:对于选项2,您将调用getData(函数(){this.processData();});而不是getData(thisProcessData)@埃里克:不,那不行
完全由函数的调用方式定义,而不是定义在何处。您的
getData(函数(){this.processData();})
的问题与
getData(this.processData)的问题完全相同不过,你可以使用闭包(我添加了一个闭包示例)。@T.J.克劳德:当然,你是对的。感谢您添加示例。顺便问一下:jQuery是否有内置的绑定函数来执行此操作?+1用于在私有范围内设置闭包fetchData和processData。