function f1(){
var n=999;
function f2(){
alert(n);
}
return f2;
}
var result=f1();
result(); // 999
请问这个代码中, 为什么return f2为什么不加() , 我试了一下,加() 最后会提示result未定义而报错。小白问一下这里面有什么讲究么? 返回f2和返回f2()有啥区别。
function f1(){
var n=999;
function f2(){
alert(n);
}
return f2;
}
var result=f1();
result(); // 999
请问这个代码中, 为什么return f2为什么不加() , 我试了一下,加() 最后会提示result未定义而报错。小白问一下这里面有什么讲究么? 返回f2和返回f2()有啥区别。
return f2
是把函数字面量返回了
加括号就是执行了,会在赋值之前先计算出结果
你可以试试在 console 里面:
function f() {
return 1
}
console.log(f) // => ƒ f() {
// return 1
// }
console.log(f()) // => 1
return f2: f2是变量,
var f2 = function(){
// 不写return就会默认return undefined
}
return f2(): f2函数会先被调用,由于没有写return ,所以会返回undefined
10 回答11.6k 阅读
2 回答3.1k 阅读✓ 已解决
3 回答2.7k 阅读✓ 已解决
2 回答2.1k 阅读✓ 已解决
4 回答2.1k 阅读✓ 已解决
3 回答1.2k 阅读✓ 已解决
3 回答1.8k 阅读✓ 已解决
先回答:
函数名返回的是函数体
函数名加括号返回的是调用这个函数产生的返回值
所以当你不加括号的时候。f1返回f2的函数体就是
这个东西。
然后下面的代码var result = f1()就相当于把这个函数的执行结果(也就是这个函数的返回值return)给了result(即f2的函数体),这时候result是个函数名。然后在函数名后面加括号调用函数就会去执行函数,所以result()其实也就是执行了上面那个函数里面的代码。
如果你加了括号,f1 return的是f2(),也就是f2的返回值,因为f2函数体里面没有写return,所以它返回的是undefined。所以result === undefined,不是一个函数。所以对return()对它调用会报错。
你可以理解为加括号就是把函数名代表的函数体执行一遍。
不加括号就代表的是函数体。