繁体   English   中英

这两者有什么区别

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM