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
好吧,至此疑问解开,虽然不知道理解的对不对,但是勉强说服自己了
