以下两个例子之间有什么区别?
setInterval(myFunc, 100);
function myFunc() { alert('asdf'); }
setInterval(myFunc, 100);
var myFunc = function myFunc() { alert('asdf'); }
答案 0 :(得分:4)
根据ECMA标准,第一个示例是函数语句,而第二个示例是函数表达式。根据Javascript,函数语句计为定义,这意味着在第一个示例中,它通过整个函数(或脚本,如果它不在函数中)可见。但是在第二个例子中, var myFunc在第二行之前不会有 function myFunc的值,因此setInterval将被传递undefined
。
函数语句和表达式之间唯一的语法区别是语句不包含在更大的表达式中:例如:(function foo() {})
是表达式,而function foo() {}
是语句。
注意:我相信旧IE(前9?)将所有函数表达式视为定义。
要阐述这个答案,请考虑以下代码:
<script language="javascript">
alert(A);
alert(B);
function A() {return "A value";}
var B = function B(){ return "B value";}
alert(A);
alert(B);
</script>
这将提醒(按顺序):
答案 1 :(得分:0)
两个样本基本上都在做同样的事情。在第二个示例中,您还可以使用具有不同名称或未命名函数的命名函数。
var myFunc = function myOtherName() { alert('asdf'); }
或
var myFunc = function() { alert('asdf'); }
他们都是一样的。
答案 2 :(得分:0)
在第一个例子中:
> setInterval(myFunc, 100);
>
> function myFunc() { alert('asdf'); }
在执行任何代码之前处理函数声明,因此当调用 setInterval 时, myFunc 作为本地参数存在。
第二个例子:
> setInterval(myFunc, 100);
>
> var myFunc = function myFunc() {
> alert('asdf'); }
的工作原因完全相同: myFunc 是使用 var 声明的,因此当 setInterval 时,它作为局部变量存在em>被称为。
哎呀!它不起作用。调用 setTimeout 时会评估 myFunc 的值,并且此时 myFunc 未分配值,因此会产生错误。稍后更改值不会影响 setTimeout 所持有的值。
最后,没有“功能声明”这样的东西。 ECMA-262在§13中定义 FunctionDeclaration 和 FunctionExpression ,没有其他类型的功能。
答案 3 :(得分:-1)
var myFunc = function(){alert('asdf');}
我从未见过第二个例子中的任何内容。我不知道它是否是宣布函数的有效方法......