7

以这种方式调用函数是有意义的:

print(square(5));  
function square(n){return n*n}

但是为什么下面的调用不起作用?

print(square(5));  
square = function (n) {  
  return n * n;  
}  

如果我们坚持使用“square = function (n)”的格式,有什么解决办法?

4

6 回答 6

12

“正常”函数声明被提升到范围的顶部,因此它们始终可用。

变量声明也被提升,但直到执行该特定代码行时才会发生赋值。

因此,如果您这样做是在范围内var foo = function() { ... }创建变量foo,并且它最初是undefined,并且只有稍后才会为该变量分配匿名函数引用。

如果“稍后”是在您尝试使用它之后,解释器不会抱怨未知变量(毕竟它确实已经存在),但它会抱怨您尝试调用undefined函数引用。

于 2012-05-29T22:05:33.257 回答
1

    var s=function ()
	{
		console.log("hi there");
        document.write("function express called");
		alert("function express called");

		
	}

	s();
 

于 2017-01-08T04:53:49.037 回答
0

您需要更改顺序,在声明和分配变量之前使用它:

square = function (n) {//Better use "var" here to avoid polluting the outer scope
  return n * n;  
}  
print(square(5));  

正确的方法var

var square = function (n) { // The variable is now internal to the function scope
  return n * n;  
}  
print(square(5));  
于 2012-05-29T22:07:06.970 回答
0

在函数表达式中,您像使用任何其他值一样使用函数,您是否期望:

print(a);
var a = 5

去工作?(我真的不是在问)

于 2012-05-29T22:07:29.340 回答
0

在第二种情况下,square是一个需要(重新)赋值的常规变量。考虑:

square = function (n) {  
  return "sponge";  
}  
print(square(5));  
square = function (n) {  
  return n * n;  
}  

您希望输出在这里是什么?

于 2012-05-29T22:07:54.003 回答
-1

var s=function ()
	{

		console.log("s");
		alert("function expression with anomious function");

		
	}

s();

var otherMethod=function ()
	{

		console.log("s");
		alert("function expression with function name");

		
	}

otherMethod();

	

于 2017-01-08T05:04:06.937 回答