0

我有一个类似这样的代码

verify_loaded_css.check (function (){
    $('#overlay').fadeOut(300, function (){
        $(this).remove(); 
    }); 
}); 

verify_loaded_css = {
    check: function (runCallback){
        if (..) {
            ..
            runCallback(); 
        } else {
            ..
        }
    }
}

我放置了带有随机数的 console.log 以查看哪些函数首先运行(有更好的方法吗?)。我看到检查函数(runCallback)首先运行,我试图理解逻辑。当您有一个匿名函数时,我假设它会自动执行它之后/其中的任何内容,即#overlay 淡出。相反,它首先运行 if 语句的 runCallback 函数,如果为真,则再次调用 runCallback()。然后在最后,它会淡出覆盖层。

这是否意味着任何匿名函数都不是自动执行的,如果你声明它是别的东西,它会首先在别处运行任何代码?

谢谢

4

2 回答 2

1

在 javascript 中,每件事都是对象。甚至是“功能”

您可以声明功能瞬间

Hint*自下而上读取。

var fadeoutCallback = function (element){
    $(element).remove(); 
}

var checkCallback = function(){
    //alert("fadeout the overlay");
    $('#overlay').fadeOut(300, fadeoutCallback); 
}

//a function that accept another instant of function
var check = function(callback){
    if(confirm("checking some condition?") == true){
        callback();
    }
}

//finally an object act as "class"
myClass = {
    myMethod: check
}

//then calling class.method
myClass.myMethod(checkCallback);
于 2012-05-02T04:00:13.250 回答
1

这是否意味着任何匿名函数都不是自动执行的,如果你声明它是别的东西,它会首先在别处运行任何代码?

正确的匿名函数不是自动执行的。

函数按照它们被调用的顺序运行,就像在其他语言中一样,但是正如 ai.farfa 提到的函数是对象并且可以被传递,因此回调的概念。

你说:

我看到检查功能(runCallback)首先运行

但更好的写法是:

check(function(){/* code in here */})

所以发生的事情是您进入check, 并runCallback绑定到定义为其参数的函数对象。

所以这在语义上是相似的(如果 js 不是那么奇怪的语言,它在语义上是相同的):

function myFadout() {/* code in here */};

check(myFadout);

在这两种情况下, 的参数都check表示相同的操作序列,而函数对象只是一个方便的抽象——无论是命名的还是无名的。因此,一旦你到达这条线runCallback(),因为runCallback是必然的myFadout,发生的事情语义上等同于myFadout().

于 2012-05-02T04:19:02.607 回答