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

时间:2015-08-19 23:38:44

标签: 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 = {}));

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

2 个答案:

答案 0 :(得分:3)

代码块之间的唯一区别是第一个代码块具有围绕创建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 = {}));

答案 1 :(得分:0)

从我看到它们是相同的,在这两种情况下,你定义函数并使它成为Utility的成员,调用它。 添加它,没有范围差异,没有上下文差异,没有真正的区别。 我认为这只是一个偏好问题。

但是,我可以看到一个潜在的差异,如果内部的一个是async函数调用,则可能存在差异,因为Utility.Func最终将undefined作为https://graph.facebook.com/albumID/photos?fields=id,likes.summary(true),comments.summary(true)&access_token=XXXXXX 一个值,这是第一个的一个非常大的问题,但我怀疑写它的人不会注意到。

相关问题