问题 JavaScript - 自动执行匿名函数和回调


我可以使用具有自执行功能的回调吗? 
如果是的话,你看过任何例子吗?

JavaScript自执行功能:

(function(){

    //Do Stuff

})()

3890
2017-11-17 09:42


起源

Plz澄清一下,“使用回调”是什么意思? - alex vasi
@alex vasi - 完成自执行功能中的所有内容后执行的代码。 - Iladarsda
@NewUser:然后你需要定义“ DONE “。这是否意味着如果你附上一些事件,他们需要被召唤至少一次?或者说再次召唤他们是不可能的? - Tadeck
@Tadeck - 完成自执行功能中的所有代码已经执行,我将只运行一次 - 一个页面/脚本加载。 - Iladarsda
@NewUser:我跟着,但这更复杂。你可以在这个匿名函数中编写一些代码,但这并不意味着它会立即执行。与基于事件的编程一样,某些代码可能会等到某个事件触发它(例如用户点击某些内容)。但我会更新我的答案,以满足我的想法。 - Tadeck


答案:


当然可以 - 这是将变量封闭在某个函数中的常用方法 它们不会干扰全局变量(或来自单独的闭包)

一些例子:

(function(){

    var counter = 0;
    var step = function(){
        counter++;
        console.log(counter + ' Mississipi...');
    };

    setInterval(step, 1000);

})();

(function(){

    var counter = 0;
    var step = function(){
        counter++;
        console.log('3 seconds passed for a ' + counter + ' time');
    };

    setInterval(step, 3000);

})();

由于闭包,它们的变量不会干扰来自不同闭包的变量(不同的匿名函数)。

工作实例 这个jsfiddle

编辑:

你想在这样的函数中执行某些回调的代码,你可能会写这样的东西:

var my_own_callback = function(data){
    // some code for callback working on data passed
};
// ...
(function(callback){
    var result; // future data sent to callback
    // do whatever you need here
    callback(result);
})(my_own_callback);

甚至是这样的:

(function(callback){
    var result; // data that will be sent to callback
    // do whatever you need here
    callback(result);
})(function(data){
    // code for callback using data set to this callback
});

但是,它似乎相当粗心,并且不必要地增加了代码的复杂性。


11
2017-11-17 09:46



对不起,作为回调,我的意思是在自执行功能中的所有内容完成后执行代码 - Iladarsda
@NewUser只要您在自执行函数中没有异步代码,其余代码将按顺序执行(意思是,不需要使用回调,只需继续使用您的代码)。如果你有异步代码,你必须将回调传输到那些代码块并适当地处理它。 - Yoshi
@Yoski - 您确定匿名函数中的代码是按顺序执行的吗?有什么方法可以实际检查吗? - Iladarsda
@NewUser:除非你异步执行某些代码,否则它会同步执行。但是如果你定义一些回调并传递它们,例如。作为事件处理程序,然后不要指望它们在main函数结束之前执行 - 它们只是被传递并且可以在事件发生的任何时候执行。但是,通常代码是逐行执行的。当您包含无限期时,可以通过冻结浏览器来检查它 for 在你的代码中循环。 - Tadeck
@NewUser:不,我能想到的第二种情况是回调 - 只要它们被你传递给它的函数调用它们就会被执行。所以,如果你为某些事件分配一些回调,例如。使用jQuery,除非某些事件调用它们,否则不会执行这些特定的回调。它够清楚吗?如果您使用异步代码或将一些回调传递给闭包之外的某些代码,则无法保证闭包中的每一行至少执行一次。清楚吗? - Tadeck


那样的东西?

(function(callback){

  //Do Stuff

  //Callback
  if(typeof callback === 'function') {
      callback();
  }
})(myCallback);

3
2017-11-17 09:54