javascript - 两个版本的函数有什么区别

标签 javascript closures iife

有人可以解释一下这两个代码块之间有什么区别吗?为什么我们需要第一种类型,而第二种类型更简洁。

第一

var Utility;
(function (Utility) {
    var Func = (function () {
        function Func(param1, param2) {
            var self = this;
            this.Owner = param2;
        }
        return Func;
    })();
    Utility.Func = Func;
})(Utility || (Utility = {}));

第二:

var Utility;
(function (Utility) {
    Utility.Func = function (param1, param2) {
            var self = this;
            this.Owner = param2;
        }
})(Utility || (Utility = {}));

上下文:第一个版本是由 typescript 编译器生成的代码,我试图理解为什么它生成第一个版本而不是更简单的第二个版本。

最佳答案

代码块之间的唯一区别在于,第一个代码块具有围绕创建 Func 函数的代码的函数作用域。这样做的唯一原因是创建一个范围,您可以在其中声明在外部范围中不可用的变量:

var Utility;
(function (Utility) {
    var Func = (function () {

        var x; // a variable in the inner scope

        function Func(param1, param2) {
            var self = this;
            this.Owner = param2;
        }
        return Func;
    })();

    // the variable x is not reachable from code here

    Utility.Func = Func;
})(Utility || (Utility = {}));

关于javascript - 两个版本的函数有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32107344/

相关文章:

javascript - !function(){ }() 与 (function(){ })()

javascript - <td ng-repeat ="x in names |orderBy:' -印地语' | limitTo :1"> {{x. name}} 如果用户编辑任何单个数据槽,则标记应更新

javascript - 使用 JavaScript 函数打印电子邮件地址以防止垃圾邮件有多好?

javascript - XHR跨域限制的目的是什么?

c# - 通过将状态存储到作用域局部变量中来避免关闭快速路径

python - 对 lambda 和列表理解感到困惑

javascript - 我们可以说这是一个 IIFE 吗?!?- 在 Javascript 中

javascript - 自动执行匿名 JavaScript 函数的括号位置?

javascript - JQuery:转换为文本区域元素

javascript - JavaScript 闭包返回的函数的范围和执行上下文