【讨论】if(function f(){}){console.log(f);}

xiaojunjor 2017-04-12 10:46:33
if(function f(){}){console.log(f);}

最开始我以为会出现function f(),结果却是f is not defined,同样情况,适用于while,switch,for
JS中没有块级作用域(花括号{}内),而是使用了函数作用域(函数体内),这是权威指南里的讲的
所以我的理解,if(){}是没有自己的作用域的,但是按照这个例子来看,if是有自己的作用域的,或者说()有自己的作用域,就是()内(不知道这么说准不准确,虽然好像没有什么实际用处,而且if(function f(){})这种写法貌似也没有什么实际意义)
按照这个理解测试了一下for:
var i = 0;for(function f(){i++;};i<5;f()){console.log(i)}

没想到结果仍然是f is not defined,不是很理解
stackoverflow上找到了http://stackoverflow.com/questions/14218779/function-names-defined-as-parameters-to-a-function-call-arent-hoisted-why-not
我的英文很差,所以只能大概理解里面的回答,跟函数声明和函数表达式有关系,另外跟()也是有关系的
但是,我仍然不能理解for循环的情况,毕竟如果是正常情况下:
function f(){};f()

是没有问题的,那为什么加到for循环中出现找不到f呢?思考了一会想到for的运算流程
for ([initialization]; [condition]; [expression])
statement

进入for后是initialization-->condition-->statement-->expression-->condition-->statement...
也就是说是先进入了statement之后才会运算expression,而在上面的测试代码中,第一次进入statement时就已经找不到函数f了,因为在()外面,所以再运算expression时会提示f is not defined
好吧,至此疑问解开,虽然不知道理解的对不对,但是勉强说服自己了
...全文
366 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaojunjor 2017-04-12
  • 打赏
  • 举报
回复
引用 4 楼 jslang 的回复:
函数声明和函数表达式的区分是 当function关键字出现在行首(语句首),它是一条“函数声明语句”,作为“语句”是没有返回值。 当function关键字不是出现在行首(语句首),它就是一条“函数表达式”,作为“表达式”有返回值。
所以()是把函数f变成了函数表达式,因此不管是 if中还是for中,都找不到函数f,并不是()有自己的作用域,这个地方不单单是(),改成其他任何形式(+,-,!,1,...)把函数f变为表达式,那么函数f外部都是获取不到f的 刚看了一篇博客讲的函数立即执行,对立面有的地方还有点疑惑,看了你的几句话瞬间这个问题和那个博客的问题都明白了,大神就是大神啊,感谢感谢!
天际的海浪 2017-04-12
  • 打赏
  • 举报
回复
函数声明和函数表达式的区分是 当function关键字出现在行首(语句首),它是一条“函数声明语句”,作为“语句”是没有返回值。 当function关键字不是出现在行首(语句首),它就是一条“函数表达式”,作为“表达式”有返回值。
天际的海浪 2017-04-12
  • 打赏
  • 举报
回复
函数表达式的函数名是以函数内局部变量的形式存在的。只在函数内有效,作用中方便对函数表达式的递归调用。
xiaojunjor 2017-04-12
  • 打赏
  • 举报
回复
引用 1 楼 zonghsh007 的回复:
学习了。不过编程首先要求是易懂,我真的还是第一次看到这么写。难以理解,又没有其它什么好处。唯一用处就是别人看不懂。
哈哈,对啊,没什么实际意义。我刚看到别人博客发有这种面试题我也懵一了下
一剑侵心 2017-04-12
  • 打赏
  • 举报
回复
学习了。不过编程首先要求是易懂,我真的还是第一次看到这么写。难以理解,又没有其它什么好处。唯一用处就是别人看不懂。

87,993

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧