[英]what is the difference between these two
我对js很新,所以我很感激一些帮助。 我有两个代码块,我认为应该完全相同,但不是。 有人可以解释他们有什么不同吗? 它看起来像在第一段代码中,解析器直接进入函数。
function embedGameSwfAfterReg() {
embedGameSwf("{$swfLocation}", "100%", "100%", {$flashVars});
}
API.registerOnload(embedGameSwfAfterReg())
和
API.registerOnload(function() {
embedGameSwfAfterReg("{$swfLocation}", "100%", "100%", {$flashVars});
});
在第一个代码块中,您将注册embedGameSwfAfterReg
函数的结果(未定义)作为onload函数( ()
表示您正在评估函数)。 删除括号以使embedGameSwfAfterReg
函数本身已注册:
API.registerOnload(embedGameSwfAfterReg)
这个
API.registerOnload(embedGameSwfAfterReg())
运行embedGameSwfAfterReg
,然后将返回值( undefined
因为它不返回值)传递给registerOnLoad
你要
API.registerOnload(embedGameSwfAfterReg)
它将函数本身传递给registerOnload
函数是Javascript中的对象,可以直接通过其名称传递。 添加parens时,它会运行该函数并传递结果。
function embedGameSwfAfterReg() {
embedGameSwf("{$swfLocation}", "100%", "100%", {$flashVars});
}
API.registerOnload(embedGameSwfAfterReg)
和
API.registerOnload(function() {
embedGameSwfAfterReg("{$swfLocation}", "100%", "100%", {$flashVars});
});
会以同样的方式工作。 你在第一种情况下使用embedGameSwfAfterReg
函数的区别是()实际上它只调用那里的函数,但在embedGameSwfAfterReg
情况下它的不同。
我觉得第二个例子应该是
API.registerOnload(function() {
embedGameSwf("{$swfLocation}", "100%", "100%", {$flashVars});
});
如果是这样,那么差异就很大了。 在第一种情况下,调用embedGameSwfAfterReg
函数并在注册时调用embedGameSwf
。 这可能不是你想要的,因为函数的返回值是undefined
。
在第二种情况下,直到稍后引发registerOnLoad
事件时才调用匿名函数。 这可能就是你想要的。
API.registerOnload()将回调函数作为参数,因此您只需将函数名称作为引用传入,否则在代码运行时直接调用该函数。
// Correct form is:
API.registerOnload(embedGameSWFAfterReg)
你的第二个示例已经是一个匿名函数,它像函数回调一样处理,因此当API.registerOnload(callback)在其代码中的某个地方调用callback()
引用时进行求值。
简短回答:第一段代码什么都不做,因为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指南
也可以随意使用jsfiddle中的简化示例,它给出了JS中匿名函数的一些实用提示。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.