Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.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,我有一些类似于下面的代码: var msg="first call"; (function test(msg) { console.log("inside self call"); } )(); msg="second call"; console.log("before inline call"); test(msg); console.log("after inline call"); 其中我需要调用一个函数(在代码开始时是自调用的) 在我看来,我无法调用

我有一些类似于下面的代码:

var msg="first call";
(function test(msg)
    {
        console.log("inside self call");
    }
)();

msg="second call";
console.log("before inline call");
test(msg);
console.log("after inline call");
其中我需要调用一个函数(在代码开始时是自调用的)

在我看来,我无法调用自调用函数。但我不确定,因为这是我第一次面对这种情况。这是我在控制台中得到的输出:

inside self call
before inline call
ReferenceError: test is not defined
除了用另一个名称重复函数代码,还有其他方法吗?

自调用函数表达式有自己的作用域
本文描述并给出了一个解决方法:

假设您有一个方法,您希望全局可访问,但是 需要一个围绕它的自调用函数来确保它是jQuery吗$ 别名安全

在本例中,global.js中包含以下代码:

(function( $ ) {
   function showLoader( cfg ) {
      if( cfg == 'show') {
         $( '.loader' ).show();
      } else //more code...
   }
})(jQuery);
在本例中,myPage.js中包含以下代码:

(function($) {
   showLoader( 'show' );
})(jQuery);
您会发现myPage.js无法访问showLoader()方法 尽管global.js是在HTML页面中首先调用的

解决方法是将showLoader()方法推出窗口 (全球)范围:

通过将函数分配给窗口范围,它现在是全局的 可到达的请记住,它现在不再受 关闭,但它仍然可以访问jQuery$别名


为什么不拆分声明和第一次调用呢?在中,名为的函数表达式变成了全局函数,所以实际上它可以在某些(错误的)浏览器中工作。;-)一开始不使用生命是最明智的方法。使用函数声明,然后调用该函数。稍后:再次调用它。不是自调用函数有自己的作用域,而是Expression有自己的作用域。您可以使用一个命名的自调用函数,并使用它作为内部递归,使用给定的名称。该名称仅存在于表达式的作用域中。@NinaScholz是的,您肯定是对的,谢谢,我将更新我的答案
(function( $ ) {
   window.showLoader = function( cfg ) {
      if( cfg == 'show') {
         $( '.loader' ).show();
      } else //more code...
   }
})(jQuery);