0

我对 js 很陌生,所以我很感激一些帮助。我有两个代码块,我认为它们应该可以相同地工作,但事实并非如此。有人可以解释它们有何不同吗?看起来在第一段代码中,解析器直接进入函数。

function embedGameSwfAfterReg() {
    embedGameSwf("{$swfLocation}", "100%", "100%", {$flashVars});
}
API.registerOnload(embedGameSwfAfterReg())

API.registerOnload(function() {
    embedGameSwfAfterReg("{$swfLocation}", "100%", "100%", {$flashVars});
});
4

6 回答 6

2

在第一个代码块中,您将embedGameSwfAfterReg函数的结果(未定义)注册为 onload 函数(()意味着您正在评估该函数)。删除括号以embedGameSwfAfterReg注册函数本身:

API.registerOnload(embedGameSwfAfterReg)
于 2013-06-14T17:30:22.930 回答
0

这个

API.registerOnload(embedGameSwfAfterReg())

运行embedGameSwfAfterReg,然后将返回值(undefined因为它不返回值)传递给 registerOnLoad

你要

API.registerOnload(embedGameSwfAfterReg)

它将函数本身传递给registerOnload

函数是 Javascript 中的对象,可以通过它们的名称直接传递。当您添加括号时,它会运行该函数并传递结果。

于 2013-06-14T17:33:02.253 回答
0
function embedGameSwfAfterReg() {
    embedGameSwf("{$swfLocation}", "100%", "100%", {$flashVars});
}
API.registerOnload(embedGameSwfAfterReg)

API.registerOnload(function() {
    embedGameSwfAfterReg("{$swfLocation}", "100%", "100%", {$flashVars});
});

会以同样的方式工作。不同之处在于您在第一种情况下使用函数的()embedGameSwfAfterReg它实际上只在那里调用了该函数,但在第二种情况下它不同。

于 2013-06-14T17:33:22.133 回答
0

我假设第二个例子应该是

API.registerOnload(function() {
    embedGameSwf("{$swfLocation}", "100%", "100%", {$flashVars});
});

如果是这样,那么差异是相当大的。在第一种情况下,该embedGameSwfAfterReg函数被调用,并且embedGameSwf在您注册时被调用。这可能不是您想要的,因为函数的返回值为undefined.

在第二种情况下,直到稍后registerOnLoad引发事件时才会调用匿名函数。这可能就是你想要的。

于 2013-06-14T17:33:25.900 回答
0

API.registerOnload() 将回调函数作为参数,因此您只需传入函数名作为引用,否则在代码运行时会直接调用该函数。

// Correct form is:
API.registerOnload(embedGameSWFAfterReg)

您的第二个示例已经是一个匿名函数,它像函数回调一样处理,因此在 API.registerOnload(callback) 使用callback()其代码中的某处调用引用时进行评估。

于 2013-06-14T17:33:33.217 回答
0

简短 的回答:第一段代码什么都不做,因为 embedGameSwfAfterReg 没有返回语句。如果 API.registerOnload 在执行之前没有准确地检查它的参数,它甚至可能会以错误告终。

第二段代码创建了一个匿名函数,该函数作为参数传递给 API.registerOnload 方法,该方法(据我从方法名称中可以看出)在 Onload 事件期间运行函数。

长答案: 在第一段代码中,您声明了一个名为 embedGameSwfAfterReg 的新函数,该函数在代码的全局范围内抵抗:

function embedGameSwfAfterReg() {
  // calls embedGameSwf function
}

之后,您执行定义的函数并将结果传递给名为 API 的对象的 registerOnload 方法:

API.registerOnload(embedGameSwfAfterReg());

正如您可能提到的,声明的函数 embedGameSwfAfterReg 没有返回语句,因此其执行结果将是未定义的。换句话说

API.registerOnload(embedGameSwfAfterReg());

正在做同样的事情

embedGameSwfAfterReg();
API.registerOnload();

所以最终它调用 API.registerOnload() 没有传递任何参数!

第二段代码创建了一个匿名函数(函数是JS中的特定对象,可以传递给其他函数/方法,有自己的方法并执行)。然后它将创建的函数(或者更好地说是对函数的引用)传递给 registerOnload - 称为“API”的对象的方法。

您应该阅读有关 JS 中的对象、函数类型、作用域、匿名函数和闭包的主题。我会建议Mozilla JavaScript 指南

也可以随意在 jsfiddle上玩一个简化的示例, 它为 JS 中的匿名函数提供了一些实用提示。

于 2013-06-14T19:41:12.513 回答