Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在javascript中实现模块模式时为什么要执行自执行_Javascript_Module Pattern - Fatal编程技术网

在javascript中实现模块模式时为什么要执行自执行

在javascript中实现模块模式时为什么要执行自执行,javascript,module-pattern,Javascript,Module Pattern,我只是想知道为什么在javascript中实现模块模式时需要自执行代码 以下代码是典型的模块模式示例: var app = app || {}; app.model = app.model || {}; app.model.person = (function () { var say = function () { alert('say'); }; return { sa

我只是想知道为什么在javascript中实现模块模式时需要自执行代码

以下代码是典型的模块模式示例:

    var app = app || {};
    app.model = app.model || {};

    app.model.person = (function () {
        var say = function () {
            alert('say');
        };

        return {
            saySomething: say
        }
    })();

但是,我找不出为什么这个函数应该用右大括号自动执行。

谁说它需要这样实现?我看不出有什么理由更具可读性:

var app = app || {};
app.model = app.model || {};

app.model.person = {
    saySomething: function () {
        alert('say');
    }
}

无法使用…

谁说需要以这种方式实现?我看不出有什么理由更具可读性:

var app = app || {};
app.model = app.model || {};

app.model.person = {
    saySomething: function () {
        alert('say');
    }
}

无法使用…

函数/模块不是使用右大括号自执行的,而是使用结尾处的
()
自执行(或自调用)


这样做的原因是为了在JavaScript中模拟隐私。函数立即执行,并返回
saySomething
函数,该函数在返回后由于闭包而保持可用,因此是公共的。
假设
函数未返回且在函数外部不可访问,因此是私有的

函数/模块不是使用右大括号自执行的,而是使用结尾处的
()
自执行(或自调用)


这样做的原因是为了在JavaScript中模拟隐私。函数立即执行,并返回
saySomething
函数,该函数在返回后由于闭包而保持可用,因此是公共的。
say
函数没有返回,并且在函数外部无法访问,因此是私有的

在您的示例中,实际上没有意义,因为
say
函数稍后会在返回的对象中公开。但是考虑一下:

app.model.person = (function () {
    var privateVar = 'I am private';

    var say = function () {
        alert(privateVar);
    };

    var doSomething = function() {
        // operates on privateVar
    };

    return {
        saySomething: say
    }
})();

在这里它是有意义的,因为从对象外部永远无法访问
privateVar

在您的示例中没有意义,因为
say
函数后来在返回的对象中公开。但是考虑一下:

app.model.person = (function () {
    var privateVar = 'I am private';

    var say = function () {
        alert(privateVar);
    };

    var doSomething = function() {
        // operates on privateVar
    };

    return {
        saySomething: say
    }
})();

在这里它是有意义的,因为从对象外部永远无法访问
privateVar

为了封装私有成员,请参阅为了封装私有成员,请参阅我仍然想知道为什么推荐自执行。如果我让person不是匿名函数而是普通构造函数,有什么不同?在使用普通构造函数的情况下,我可以调用如下函数:var p=new app.model.person();p、 说点什么;不同的是saySomething()函数在任何地方都可以访问,一个公共成员。自我执行并不总是被推荐的,它只是在某些情况下很有用,比如当您想在JavaScript中模拟隐私时。如果您不关心私人成员和公共成员,那么就没有理由使用它。JavaScript中有许多用于实现不同功能的模式,模块模式只是其中之一:)隐私、、、是可以实现的,即使它不是匿名和自执行的。像“app.model.person=function(){…};var p=new app.model.person()”这样的代码在封装方面有相同的结果,不是吗?我仍然想知道为什么推荐自执行。如果我让person不是匿名函数而是普通构造函数,有什么不同?在使用普通构造函数的情况下,我可以调用如下函数:var p=new app.model.person();p、 说点什么;不同的是saySomething()函数在任何地方都可以访问,一个公共成员。自我执行并不总是被推荐的,它只是在某些情况下很有用,比如当您想在JavaScript中模拟隐私时。如果您不关心私人成员和公共成员,那么就没有理由使用它。JavaScript中有许多用于实现不同功能的模式,模块模式只是其中之一:)隐私、、、是可以实现的,即使它不是匿名和自执行的。类似“app.model.person=function(){…};var p=new app.model.person()”这样的代码在封装方面有相同的结果,不是吗?