Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/383.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 - Fatal编程技术网

私有与公共Javascript函数

私有与公共Javascript函数,javascript,Javascript,有人能解释一下这两种功能的区别吗 (function(Engine, $, undefined) { //hidden from scope //public function below Engine.Init = function() { console.log("IM PUBLIC"); } //anonymous functions below function Login() { console.log("IM

有人能解释一下这两种功能的区别吗

(function(Engine, $, undefined) { //hidden from scope
    //public function below
    Engine.Init = function() {
        console.log("IM PUBLIC");
    }

    //anonymous functions below
    function Login() {
        console.log("IM PRIVATE");
    }
})( window.Engine = window.Engine || {}, jQuery );

具体地说,我想知道为什么
Engine.Init()
可以在
控制台中使用,而
Login
不可用。

Init
是引用函数的
Engine
对象的属性。
您可以像访问任何其他属性一样访问它


Login
是匿名“立即调用函数表达式”(IIFE)中的局部变量;与其他局部变量一样,其名称仅在声明函数中可见,因为参数的原因,引擎是全局的:

(window.Engine = window.Engine || {}, jQuery)
并且在全局命名空间中可用,如果您:

Engine.Login = function(){}
这将在全球范围内提供


函数登录仅在匿名自执行函数的作用域内可用

函数本身并没有什么区别。唯一的区别是,第一个函数分配给对象的属性(
Engine.init
),该属性在全局范围(
window.Engine
)中定义,而第二个函数是在本地范围内定义的

下面是一个等效但更简单的示例:

function foo() {
    // 1
    window.globalFunc = function() {
        // global/public
    }

    // 2
    function localFunc() {
        // local/private
    }
}

foo();
由于第一个函数显式分配给全局变量,因此在执行
foo
后,可以在
foo
之外访问该函数
localFunc
未导出,因此是本地到
foo
,即它无法访问并且不存在于
foo
之外

function(Engine, $, undefined) {
...
}
这实际上是一个结束。因此,该函数中定义的所有内容仅在该范围内可用。当你这样做的时候

Engine.Init = ...

创建附着到引擎对象的特性。在您的例子中,引擎是一个全局对象,这意味着您可以通过控制台访问它。

我想在这里问您一个问题,尽管它可能与这个问题无关:(function(){})和function(){}之间有什么区别?这与匿名函数或作用域有关吗?这只是一个语法修饰,以确保函数定义可以立即调用。请参阅“旁白:函数、参数和语法错误”下的内容。@lmjohns3:您为我指明了绝对正确的方向。谢谢你的链接。可爱的解释和更好的链接!干杯,伙计们!“因此,该函数中定义的所有内容仅在该范围内可用。”这与闭包无关,每个函数都是这样工作的。虽然从技术上讲,JS中的每个函数都是闭包,但这里的问题与闭包无关。。。JavaScript中的每个函数(和其他任何东西一样)都是一个对象。我们可以说对象的属性是公共变量。如果在函数中添加“var something=…”,则该对象是一个私有变量,仅适用于闭包的作用域。这不是真的吗?你可以这么说,但是函数是否是闭包并不重要。