下面的函数调用在Javascript中是如何工作的

下面的函数调用在Javascript中是如何工作的,javascript,functional-programming,scope,Javascript,Functional Programming,Scope,我一直在使用与本文相关联的代码 在条款代码中,为变量分配了一个函数,如下所示: var messageFactory = (function() { var that = {}, $chatMessage = $('<p></p>'). addClass('chat message'), $nick = $('<span></span>'). addClass('nic

我一直在使用与本文相关联的代码

在条款代码中,为变量分配了一个函数,如下所示:

var messageFactory = (function() {
    var that = {},
        $chatMessage = $('<p></p>').
          addClass('chat message'),
        $nick = $('<span></span>').
          addClass('nick'),
        $systemMessage = $('<p></p>').
          addClass('system message');

    var chat = function(message) {
      var $filledNick = $nick.clone().
            text(message.nick + ':');
      return $chatMessage.clone().
        append($filledNick).
        append(message.text);
    };

    var system = function(message) {
      return $systemMessage.clone().text(message.text);
    };

    that.chat = chat;
    that.system = system;

    return that;
  })();

那些电话是怎么回事?具体地说,var messageFactory的工作方式似乎与C语言中的类定义类似,我缺少与作用域相关的机制,无法了解值如何通过对象{text:'''.'传递


多谢

它是匿名类声明和实例化


首先要注意的也是可以说是最重要的一点是最后一行。具体地说,在;。这将立即在第1行执行匿名函数。注意这一点很重要,因为messageFactory将不包含匿名函数,而是包含从它返回的任何内容。为了更好地理解这一点,我将举一个例子

var x = (function(){ return "Hello!"; })();
// x will contain "Hello!", not the function.
要记住的第二件事是Javascript中的对象将维护对它们在中创建的闭包的引用。因此,如果您像上面所做的那样立即执行一个函数,这将形成一个闭包,并且在该闭包中创建的对象将保持对它的引用,即使在函数执行完毕之后也是如此。另一个例子

var sayHi = (function(){ 
    var salutation = "Hello";
    return function(name) {
       return salutation + ", " + name + ".";
    }
})();
再次注意,我们有一个匿名函数正在立即执行。因此变量sayHi将不包含外部匿名函数,而是它的返回值。所以sayHi实际上将包含函数名{return sallation+,+name+。;}。您会注意到,我们没有传递问候语,但我们仍然可以访问它,因为它是创建此函数的闭包的一部分

理解所提供代码的最后一点是,在Javascript中,{}是一个对象文本。这基本上等同于说“新对象”。这些对象可以具有与C对象相同的属性和方法,C对象就是.text的来源

在第2行,代码正在创建一个Object-literal:var={}。下一个var创建是var chat=functionmessage{…,其中创建了一个函数,该函数接受一个message参数并对其执行一些操作。在代码末尾,该chat函数被分配给该函数的chat属性,然后返回:that.chat=chat并返回该属性

所有这一切的要点是messageFactory不包含它似乎被分配到的函数,而是该函数的返回。在本例中,该返回实际上是该对象,它有两个属性chat和system。这些属性实际上指向同一个闭包中的chat和system变量,该闭包与at是在年创建的,这使得所有这些都可以工作

最后一部分非常简单……当您调用messageFactory.chat{text:'something',nick:Joe}时,实际上是将一个对象作为参数传递给闭包内的chat函数。然后它引用该对象的nick和text属性以返回其结果


希望这能有所帮助。我不确定我是否解释得很好,但这就是我脑海中的想法。

非常感谢您花时间给出如此详细的答复!这让我彻底明白了。
var x = (function(){ return "Hello!"; })();
// x will contain "Hello!", not the function.
var sayHi = (function(){ 
    var salutation = "Hello";
    return function(name) {
       return salutation + ", " + name + ".";
    }
})();