Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/451.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/2/jquery/86.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 难以确定什么';这';在JS/jQuery代码中引用_Javascript_Jquery_This_Asynccallback - Fatal编程技术网

Javascript 难以确定什么';这';在JS/jQuery代码中引用

Javascript 难以确定什么';这';在JS/jQuery代码中引用,javascript,jquery,this,asynccallback,Javascript,Jquery,This,Asynccallback,在以下代码的多个实例中,我很难理解“this”指的是什么: jQuery(function ($) { var coreChat = { fetch: function (fn) { $.ajax({ url: "https://api.parse.com/1/classes/chats", data: { order: 'createdAt', limit: 1

在以下代码的多个实例中,我很难理解“this”指的是什么:

 jQuery(function ($) {

    var coreChat = {

      fetch: function (fn) {
        $.ajax({
          url: "https://api.parse.com/1/classes/chats",
          data: {
             order: 'createdAt',
             limit: 10
          },
          type: "GET"
        })
        .done(function(data) {
          var messages = [];
          for (var i = 0, len = data.results.length; i < len; i++) {
            messages.push(data.results[i].text);
          }

          return fn(messages);
        });
      },

      send: function (message) {
        var data = JSON.stringify({text: message});
        $.ajax({
          url: "https://api.parse.com/1/classes/chats",
          data: data,
          type: "POST"
        });
      },

      display: function (messages) {

        // http://jsperf.com/update-only-text-vs-remove-dom

        var messageNode = $(".messages").find("li");

        messageNode.each(function (i) {
          var $this = $(this);
          if ($this.text() !== messages[i]) {
            $this.text(messages[i]);
          }
        });

      }

    };


    var myChat = {

      init: function () {
        **this**.fetchInitialData();
        **this**.bindSendEvent();
        **this**.refresh();
      },

      fetchInitialData: function () {
        var messagesWrapper = $(".messages");
        for (var i = 0; i < 10; i++) {
          $("<li></li>").appendTo(messagesWrapper);
        }
        myChat.updateMessages();
      },

      bindSendEvent: function () {
        $(".send").on("click", function (e) {
          var input = $(".draft");
          myChat.send(Chat.username + ": " + input.val());
          input.val("");
          e.preventDefault();
        });
      },

      refresh: function () {
        setInterval(function () {
          myChat.updateMessages();
        }, 3000);
      },

      updateMessages: function () {
        this.fetch(function (messages) {
          myChat.display(messages);
        });
      }

    };

    $.extend(myChat, coreChat);
    myChat.init();

  });
“这”在这里指的是什么?coreChat在代码的第二行到最后一行被扩展到myChat,这一事实在确定“this”指的是什么方面有区别吗

$.extend(myChat, coreChat);
此外,myChat对象的updateMessages属性中还有另一个“this”

updateMessages: function () {
        this.fetch(function (messages) {
          myChat.display(messages);
        });
      }
^在这种情况下,这指的是什么?coreChat的fetch函数正在“this”上执行,但是“this”是什么

作为一个简单的切题-在updateMessages函数中,它调用'fetch'函数。'fetch'与回调函数是异步的('fetch'最初在coreChat对象中找到)。但在updateMessages中,作为参数传入以获取的函数是什么?fetch是否应该执行其原始回调函数,然后该参数将充当回调函数的参数?我在这方面肯定很困惑

^我知道这是两个独立的问题-如果有问题,我会删除它,并在一个新的独立问题中发布,但我只是想,因为有人可能已经阅读了整个代码,也许他/她已经准备好回答第二个问题,我不妨问一下


提前谢谢

这在JavaScript中取决于函数本身的使用方式。它的变化取决于父对象、绑定/应用/调用调用(如果与构造函数一起使用)等。。查看所有血淋淋的细节。

这在JavaScript中取决于函数本身的使用方式。它的变化取决于父对象、绑定/应用/调用调用(如果与构造函数一起使用)等。。查看所有血淋淋的细节。

这在JavaScript中取决于函数本身的使用方式。它的变化取决于父对象、绑定/应用/调用调用(如果与构造函数一起使用)等。。查看所有血淋淋的细节。

这在JavaScript中取决于函数本身的使用方式。它的变化取决于父对象、绑定/应用/调用调用(如果与构造函数一起使用)等。。查看所有血淋淋的细节。

在代码中,“this”几乎总是指myChat对象


如果要调用init,您将编写
myChat.init()
。init是myChat对象的一部分,因此
引用包含的对象。Init是在myChat的范围内指定的,与您的所有其他功能一样,这意味着此功能和所有其他功能都是
myChat
的一部分,因此
this
myChat

var myChat = {

      init: function () {
        this.fetchInitialData();
        this.bindSendEvent();
        this.refresh();
      },
      ...
}
另外,如果查看extend()上的jquery文档,说明是“将两个或多个对象的内容合并到第一个对象中”。因此,当您
$.extend(myChat、coreChat)时
,实际上您正在将所有属性从
coreChat
复制到
myChat
对象中。因此,当您在这段代码中调用fetch时,实际上是在调用已复制到
myChat
对象中的fetch方法,因此
this
仍然引用
myChat
。要进一步强调这些方法已添加到myChat对象,请注意您正在调用
myChat.display
?这是在
coreChat
中定义的,但是您使用
myChat
访问它

updateMessages: function () {
        this.fetch(function (messages) {
          myChat.display(messages);
        });
      }
有一个实例,
未引用
myChat
。这在
coreChat
的显示功能中。因为您使用的是jquery。在该函数范围内的每个函数,
引用正在运行该函数的列表项,而不是
coreChat
对象(或者更准确地说是上文解释的
myChat
coreChat
函数的副本)

至于你问题的第二部分:

作为参数传递给
fetch
的函数是当
fetch
完成时的回调函数。
fetch
的定义包括一个函数作为参数:

fetch: function (fn) {   
.done
函数中,调用回调函数,传递消息数据,并返回回调结果:

return fn(messages);
因此,您调用
.fetch
并传入函数,
fetch
执行并执行其所有处理,然后
fetch
调用传入函数。

在代码中,“this”几乎总是指myChat对象


如果要调用init,您将编写
myChat.init()
。init是myChat对象的一部分,因此
引用包含的对象。Init是在myChat的范围内指定的,与您的所有其他功能一样,这意味着此功能和所有其他功能都是
myChat
的一部分,因此
this
myChat

var myChat = {

      init: function () {
        this.fetchInitialData();
        this.bindSendEvent();
        this.refresh();
      },
      ...
}
另外,如果查看extend()上的jquery文档,说明是“将两个或多个对象的内容合并到第一个对象中”。因此,当您
$.extend(myChat、coreChat)时
,实际上您正在将所有属性从
coreChat
复制到
myChat
对象中。因此,当您在这段代码中调用fetch时,实际上是在调用已复制到
myChat
对象中的fetch方法,因此
this
仍然引用
myChat
。要进一步强调这些方法已添加到myChat对象,请注意您正在调用
myChat.display
?这是在
coreChat
中定义的,但是您使用
myChat
访问它

updateMessages: function () {
        this.fetch(function (messages) {
          myChat.display(messages);
        });
      }
有一个实例,
未引用
myChat
。这在
coreChat
的显示功能中。因为您使用的是jquery.ea