我没有得到以下代码中发生的事情。为什么构造函数被包含在另一个函数中,为什么构造函数和它所包含的函数都给出了相同的名称?为什么封闭函数已被自调用?
var Greeter = (function () {
function Greeter(message) {
this.greeting = message;
}
Greeter.prototype.greet = function () {
return "Hello, " + this.greeting;
};
return Greeter;
}());
var greeter;
greeter = new Greeter("world");
console.log(greeter.greet());
答案 0 :(得分:2)
您可以将自调用函数视为一种高阶函数,它会返回一些具有某种配置的函数。
好的,那个自我调用功能在做什么?它包含一个构造函数,它们包含一个名为" greeting "的公共属性。从构造函数接收的输入参数,被赋值给greeting
。在此签名之后,它会在prototype
的帮助下为此构造函数添加一些辅助函数,这将打印问候语消息。
原型是什么意思?它是javascript https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/prototype
的主要支柱之一嘛!我们真的需要一个自我调用功能吗?答案是,不!我们也可以用一种简单的方式编写,就像下面一样,
function Greeter(message) {
this.greeting = message;
}
Greeter.prototype.greet = function () {
return "Hello, " + this.greeting;
};
var greeter;
greeter = new Greeter("world");
console.log(greeter.greet());
那就是它!并且它将给出如上所述的确切结果。
那为什么那个人使用自我调用功能呢?我相信,酷炫的设计模式总是闪耀着。那家伙有一个计划写一些工厂函数的东西,它会给我一个完全配置的构造函数。在这种情况下,自调用表达式只不过是所谓的工厂。
注意:在您的原始帖子中,最外层的 Greeter 不是真正的函数,它是一个包含某个函数的简单变量,由该自调用块返回。您可以为该变量使用任何名称。
答案 1 :(得分:2)
在这种特殊情况下,将Greeter
包裹在一个立即调用的函数(IIFE)中没有意义; Ravindra Thorat是正确的,重写会产生(mostly)等效行为。
当您在匿名立即执行的函数中添加更多内容时,此构造开始有意义,例如strict mode标记或私有变量(以下示例中为GREETING
):
var Greeter = (function () {
"use strict";
const GREETING = "Hello, ";
function Greeter(message) {
this.greeting = message;
}
Greeter.prototype.greet = function () {
return GREETING + this.greeting;
};
return Greeter;
}());
var greeter;
greeter = new Greeter("world");
console.log(greeter.greet());
// console.log(GREETING) // not defined here -- only available inside the anonymous function
已更新以回复评论:
请注意,最外层变量Greeter
的值不是外部匿名(无名)函数本身,而是调用的结果。比较:
var Greeter = (function() {...})() // the returned value is assigned to Greeter
var Greeter = (function() {...}) // the anonymous function without parameters is assigned to Greeter
由于外部匿名函数以return Greeter
结尾,因此最外层Greeter
变量的值在IIFE内声明的function Greeter(message)
。
基本上,IIFE内部的所有内容都不可用,除了显式返回的对象(本例中为Greeter(message)
构造函数)。