使用1个参数定义JavaScript函数,然后在没有任何参数的情况下调用它

时间:2014-06-10 16:32:18

标签: javascript

我正在查看以下代码段作为Google JS Youtube API的示例:

    function outputStatus(e) {
        alert("e.success = " + e.success +"\ne.id = "+ e.id +"\ne.ref = "+ e.ref);
    }
    swfobject.embedSWF("test6.swf", "myContent", "300", "120", "9.0.0", "expressInstall.swf", null, null, null, outputStatus);

Page来自:http://www.bobbyvandersluis.com/swfobject/testsuite_2_2/test_dynamic2.html

API文档:https://code.google.com/p/swfobject/wiki/api#swfobject.embedSWF%28swfUrlStr,_replaceElemIdStr,_widthStr,_height

所以我想弄清楚它是如何工作的。我知道outputStatus(e)被用作swfobject.embedSWF(...)的回调函数,但我不明白它是如何在没有参数的情况下调用的。有人可以解释进入这样的程序的机器吗?

4 个答案:

答案 0 :(得分:4)

没有参数就没有被调用。你在这做了什么

swfobject.embedSWF("test6.swf", "myContent", "300", "120", "9.0.0", "expressInstall.swf", null, null, null, outputStatus);

将函数引用传递给embedSWF函数,而不是执行它。

embedSWF函数将该函数独立调用为其代码中的某个回调函数。

要了解其工作原理,您必须了解JavaScript中的函数是first class citizens。这意味着它们可以存储在变量中并作为参数传递。请考虑以下代码

var myFunction = function() {
    //do something
}

//storing the function reference in another variable
//in a sense, 'pointing' at it
//notice the absence of parantheses (), which would invoke the function immediately
var callback = myFunction;

//execute the function pointed at by callback
//which is the same as executing myFunction
callback();

答案 1 :(得分:2)

你必须记住某处,swfobject.embedSWF被定义为一个函数。让我们假装它看起来像这样。

swfobject.embedSWF = function(){

}

现在当我们将outputStatus函数作为回调传入时,embedSWF可以做这样的事情

   swfobject.embedSWF = function(outputStatus){
     var e = 'something useful';
     outputStatus(e);
   }

所以它最终会被e的参数调用,但是他们已经封装了远离你的API作为其用户。

答案 2 :(得分:0)

Javascript中的函数可以传递并分配给变量和函数参数:

function myFunction(x){
    console.log("Hello", x);
}

var func = myFunction; //This just makes "func" refer to myFunction;
                       //It does NOT call "myFunction" yet because there are no parenthesis.

func(10);

将函数作为参数传递给其他函数的工作方式类似:

function myFunction(x){
    console.log("Hello", x);
}

function doIt(func){
    func(10);
}

doIt(myFunction);

答案 3 :(得分:0)

正如其他人所提到的,只传递函数的回调。在您提供的代码示例中未明确调用outputStatus - embedSWF可能在内部调用outputStatus

可以在没有参数的情况下调用JavaScript函数 ,并且也可以使用比函数定义的参数更多的参数调用它们。此行为非常有用,因为JavaScript中没有内置函数重载。但是,在此示例中,在没有参数的情况下调用outputStatus将导致e未定义,并且将抛出异常。