Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/393.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_Javascript Objects - Fatal编程技术网

明确的使用方法;这";在JavaScript中

明确的使用方法;这";在JavaScript中,javascript,javascript-objects,Javascript,Javascript Objects,我开始用JavaScript定义类,我对关键字this有很多麻烦 下面是我想做的一个例子: function MyMap() { this.map = new google.maps.Map(....); google.maps.event.addListener(this.map, 'idle', function() { this.mapIdle(); // PROBLEM: "this" undefined }); this.ma

我开始用JavaScript定义类,我对关键字
this
有很多麻烦

下面是我想做的一个例子:

function MyMap() {

    this.map = new google.maps.Map(....);

    google.maps.event.addListener(this.map, 'idle', function() {
        this.mapIdle();    // PROBLEM: "this" undefined
    });

    this.mapIdle = function() {
        google.maps.event.addListener(marker, 'click', function() {
            $("button").click(function() {
                $.ajax({
                    success: function() {
                        this.map.clearInfoWindows(); // PROBLEM: "this" undefined
                    }
                });
            });
        });
    }
}
正如您在注释中看到的,
这个
在这里不起作用,因为它是在闭包中使用的

我已经开始使用类似于:

甚至是在你不得不绕过你的回调函数的地方(说真的!!)

这是非常丑陋的,而且不适用于任何地方。当我得到很多嵌套的lambda函数(如我给出的示例中所示)时,我不知道如何使用class属性


做这件事的最佳和最正确的方法是什么?

如果使用jQuery,
$


如果使用jQuery,
$.proxy
非常方便:


您只需将对象和函数分配给局部变量,然后它们就包含在回调函数的闭包中:

function MyMap() {

  var map = new google.maps.Map(....);

  var mapIdle = function() {
    google.maps.event.addListener(marker, 'click', function() {
      $("button").click(function() {
        $.ajax({
          success: function() {
            map.clearInfoWindows();
          }
        });
      });
    });
  };

  this.map = map;
  this.mapIdle = mapIdle; // Is this needed?

  google.maps.event.addListener(this.map, 'idle', function() {
    mapIdle();
  });

}
MyMap.prototype.myMethod = function() {
   var self = this;
   // use self in nested functions
};

您只需将对象和函数分配给局部变量,然后它们就包含在回调函数的闭包中:

function MyMap() {

  var map = new google.maps.Map(....);

  var mapIdle = function() {
    google.maps.event.addListener(marker, 'click', function() {
      $("button").click(function() {
        $.ajax({
          success: function() {
            map.clearInfoWindows();
          }
        });
      });
    });
  };

  this.map = map;
  this.mapIdle = mapIdle; // Is this needed?

  google.maps.event.addListener(this.map, 'idle', function() {
    mapIdle();
  });

}
MyMap.prototype.myMethod = function() {
   var self = this;
   // use self in nested functions
};

最简单的方法是定义一个
self
变量(或者
,如果您不介意非语义变量名),正如您已经提到的:

function MyMap() {
   var self = this;

   // in nested functions use self for the current instance of MyMap
}
注意,对于添加到原型中的方法(如果它们使用嵌套函数),必须再次执行此操作:


您还应该仔细阅读,注意它不适用于IE,最简单的方法是定义一个
self
变量(或者
,如果您不介意非语义变量名称的话),如您所述:

function MyMap() {
   var self = this;

   // in nested functions use self for the current instance of MyMap
}
注意,对于添加到原型中的方法(如果它们使用嵌套函数),必须再次执行此操作:


您还应该仔细阅读,注意它不适用于JavaScript中的IE,
会在每个函数调用中重新分配

这只是JavaScript中必须注意的一点。一开始可能会让人困惑,但一旦你知道了一些简单的规则,它实际上就相当简单了

如果它是一个类似于
myObj.doSomething()
的方法调用,那么
将自动设置为
myObj
内部的
doSomething()

如果在进行函数调用时要显式控制
this
的值,可以使用
doSomething.apply()
doSomething.call()
来控制函数内部设置的
this
值。这就是事件处理程序回调所做的。他们显式地设置
this
指向创建事件的对象(这是非常有用的)。您可以阅读有关MDN的更多信息

如果只调用常规函数,则
将设置为全局对象,该对象在浏览器中是
窗口
对象

所有回调函数的
this
值都会被弄乱,因为每个函数调用都会更改
this
。由于您的事件处理程序是回调函数,而成功处理程序是Ajax函数中的回调函数,因此您应该预期,
this
的值不会从周围的代码中保留。有使用代理或绑定函数的变通方法,但通常在闭包中捕获
this
的前一个值同样容易,只需使用类似
var self=this的东西从那里访问它

在您的环境中,当您希望从事件处理程序外部访问
这个
指针时,正确的做法是将其保存到一个局部变量中,您将可以在事件处理程序中,甚至在事件处理程序中的Ajax调用中访问该局部变量。没有比这更干净的方法了。通过这种方式,您可以访问来自事件或Ajax调用的
This
指针,以及来自调用对象的
This
指针,如下所示:

    var self = this;
    self.mapIdle = function() {
        google.maps.event.addListener(marker, 'click', function() {
            $("button").click(function() {
                $.ajax({
                    success: function() {
                        self.map.clearInfoWindows(); // PROBLEM: "this" undefined
                    }
                });
            });
        });
    }
}

在JavaScript中,
这个
在每次函数调用时都被重新分配

这只是JavaScript中必须注意的一点。一开始可能会让人困惑,但一旦你知道了一些简单的规则,它实际上就相当简单了

如果它是一个类似于
myObj.doSomething()
的方法调用,那么
将自动设置为
myObj
内部的
doSomething()

如果在进行函数调用时要显式控制
this
的值,可以使用
doSomething.apply()
doSomething.call()
来控制函数内部设置的
this
值。这就是事件处理程序回调所做的。他们显式地设置
this
指向创建事件的对象(这是非常有用的)。您可以阅读有关MDN的更多信息

如果只调用常规函数,则
将设置为全局对象,该对象在浏览器中是
窗口
对象

所有回调函数的
this
值都会被弄乱,因为每个函数调用都会更改
this
。由于您的事件处理程序是回调函数,而成功处理程序是Ajax函数中的回调函数,因此您应该预期,
this
的值不会从周围的代码中保留。有使用代理或绑定函数的变通方法,但通常在闭包中捕获
this
的前一个值同样容易,只需使用类似
var self=this的东西从那里访问它

在您的环境中,当您希望从事件处理程序外部访问
这个
指针时,正确的做法是将其保存到一个局部变量中,您将可以在事件处理程序中,甚至在事件处理程序中的Ajax调用中访问该局部变量。没有比这更干净的方法了。通过这种方式,您可以访问事件或Ajax调用中的
This
指针和调用对象中的
This
指针,如下所示