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

12
我可以在自执行函数中使用回调函数吗?
如果可以,你有没有看到任何例子?

JavaScript自执行函数:

(function(){

    //Do Stuff

})()

1
请说明,“使用回调”是什么意思? - alex vasi
1
@alex vasi - 在自执行函数内部的所有代码完成后,将执行该代码。 - Iladarsda
1
@NewUser:那么您需要定义“_done_”。这是指如果附加了某些事件,它们是否至少需要被调用一次?还是说它们将无法再次被调用? - Tadeck
@outis - 只要我们不进行任何 AJAX 请求,自调用函数内部执行的代码并不重要,对吗? - Iladarsda
@NewUser:你告诉我们吧。这种歧义部分是因为示例代码没有展示你问题的核心部分:回调函数的使用。这个匿名函数是应该作为回调函数,调用回调函数还是其他什么?无论是英文问题陈述还是示例代码都不足以描述你想要询问的内容。 - outis
显示剩余3条评论
2个回答

12

当然可以——将变量封装在某个函数内部,使其不会干扰全局变量(或来自不同闭包的变量)是一种常见的方法。

以下是一些例子:

(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
});

然而,这种方式似乎有些粗心,并且不必要地增加了代码的复杂性。


1
抱歉,我所说的回调函数是指在自执行函数内部所有操作完成后要执行的代码。 - Iladarsda
2
只要在自执行函数中没有异步代码,其余的代码将按顺序执行(也就是说,不需要使用回调函数,可以继续编写代码)。如果有异步代码,则必须将回调传递到这些代码块并适当处理。 - Yoshi
@Yoski - 你确定匿名函数中的代码是按顺序执行的吗?我们有什么实际的方法可以检查吗? - Iladarsda
@Tadeck - 异步仅适用于函数外部吗?请注意,我们不会进行任何AJAX请求。 - Iladarsda
1
@NewUser:不,我能想到的第二种情况是回调函数 - 它们在被传递给函数并调用时执行。因此,如果你将某个回调函数分配给某个事件,例如使用jQuery,除非它们被某个事件调用,否则这些特定的回调函数将不会被执行。这样清楚吗?如果你使用异步代码或将某些回调函数传递给闭包外部的代码,则无法保证闭包中的每一行代码至少执行一次。这样清楚吗? - Tadeck
显示剩余2条评论

3

您需要的是这样的吗?

(function(callback){

  //Do Stuff

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接