我对js很新,所以我很感激一些帮助。我有两个代码块,我认为应该完全相同,但不是。有人可以解释他们有什么不同吗?看起来在第一段代码中,解析器直接进入函数。
function embedGameSwfAfterReg() {
embedGameSwf("{$swfLocation}", "100%", "100%", {$flashVars});
}
API.registerOnload(embedGameSwfAfterReg())
和
API.registerOnload(function() {
embedGameSwfAfterReg("{$swfLocation}", "100%", "100%", {$flashVars});
});
答案 0 :(得分:2)
在第一个代码块中,您正在注册embedGameSwfAfterReg
函数(未定义)的结果作为onload函数(()
表示您正在评估函数)。删除括号以使embedGameSwfAfterReg
函数本身已注册:
API.registerOnload(embedGameSwfAfterReg)
答案 1 :(得分:0)
此
API.registerOnload(embedGameSwfAfterReg())
运行embedGameSwfAfterReg
,然后将返回值(undefined
,因为它没有返回值)传递给registerOnLoad
你想要
API.registerOnload(embedGameSwfAfterReg)
将函数本身传递给registerOnload
函数是Javascript中的对象,可以直接通过其名称传递。当您添加parens时,它会运行该函数并传递结果。
答案 2 :(得分:0)
function embedGameSwfAfterReg() {
embedGameSwf("{$swfLocation}", "100%", "100%", {$flashVars});
}
API.registerOnload(embedGameSwfAfterReg)
和
API.registerOnload(function() {
embedGameSwfAfterReg("{$swfLocation}", "100%", "100%", {$flashVars});
});
会以同样的方式工作。
区别在于(),您在第一种情况下使用embedGameSwfAfterReg
函数
它实际上只在那里调用函数,但在第二种情况下它的不同。
答案 3 :(得分:0)
我觉得第二个例子应该是
API.registerOnload(function() {
embedGameSwf("{$swfLocation}", "100%", "100%", {$flashVars});
});
如果是这样,那么差异就很大了。在第一种情况下,调用embedGameSwfAfterReg
函数,并在注册时调用embedGameSwf
。这可能不是您想要的,因为函数的返回值是undefined
。
在第二种情况下,直到稍后引发registerOnLoad
事件时才会调用匿名函数。这可能就是你想要的。
答案 4 :(得分:0)
API.registerOnload()将回调函数作为参数,因此您只需将函数名称作为引用传入,否则在代码运行时直接调用该函数。
// Correct form is:
API.registerOnload(embedGameSWFAfterReg)
您的第二个示例已经是一个匿名函数,其处理方式类似于函数回调,因此在API.registerOnload(回调)在其内部某处调用callback()
引用时进行求值。
答案 5 :(得分:0)
简答: 第一段代码什么都不做,因为embedGameSwfAfterReg没有return语句。如果API.registerOnload在执行之前没有准确地检查其参数,那么它甚至可能最终会出错。
第二段代码创建一个匿名函数,该函数作为参数传递给API.registerOnload方法,从方法名称可以看出,它在Onload事件期间运行函数。
答案很长: 在第一段代码中,您声明了一个名为embedGameSwfAfterReg的新函数,该函数在代码的全局范围内抵制:
function embedGameSwfAfterReg() {
// calls embedGameSwf function
}
之后,执行已定义的函数并将结果传递给名为API的对象的registerOnload方法:
API.registerOnload(embedGameSwfAfterReg());
正如您可能提到的,声明的函数embedGameSwfAfterReg没有return语句,因此其执行结果将是未定义的。换句话说
API.registerOnload(embedGameSwfAfterReg());
和
一样embedGameSwfAfterReg();
API.registerOnload();
所以最终它调用API.registerOnload()而没有传递任何参数!
第二段代码创建一个匿名函数(函数是JS中的特定对象,可以传递给其他函数/方法,有自己的方法并执行)。然后它将创建的函数(或者更好地说是对函数的引用)传递给registerOnload - 一个名为“API”的对象的方法。
您应该阅读有关JS中的对象,函数类型,范围,匿名函数和闭包的主题。我会建议Mozilla JavaScript guide
还可以随意使用a simplified example at jsfiddle,它可以对JS中的匿名函数提供一些实用的提示。