这两者有什么区别

时间:2013-06-14 17:28:46

标签: javascript

我对js很新,所以我很感激一些帮助。我有两个代码块,我认为应该完全相同,但不是。有人可以解释他们有什么不同吗?看起来在第一段代码中,解析器直接进入函数。

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

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

6 个答案:

答案 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中的匿名函数提供一些实用的提示。