我正在查看以下代码段作为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
所以我想弄清楚它是如何工作的。我知道outputStatus(e)
被用作swfobject.embedSWF(...)
的回调函数,但我不明白它是如何在没有参数的情况下调用的。有人可以解释进入这样的程序的机器吗?
答案 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
未定义,并且将抛出异常。