下面的函数调用在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 + ".";
}
})();