我在看《你不知道的JavaScrpit》中遇到类似这样一个例子:
(function foo(){
console.log('函数内部:'+foo);//打印出这个函数体
})();
console.log('函数外部:'+foo);//报错。Uncaught ReferenceError: foo is not defined
书上的解释是:
foo 被绑定在函数表达式自身的函数中而不是所在作用域中。
换句话说,(function foo(){……})作为函数表达式意味着foo只能在..所代表的位置被访问,外部作用域则不行。
我疑问的是:
1、为什么foo被绑定在函数表达式自身的函数中?
- 是语法上本来就是这样规定的还是有其他的解释?
- 如果有其他的解释,那是什么原理呢?
2、foo属于哪个作用域?
- 从位置上看,foo是属于全局作用域的,但是通过代码可以看出在全局作用域中无法访问。那么,foo是不是就不属于全局作用域?而是属于foo函数作用域,也就是属于函数自身的作用域?
希望走过路过的大神指点一二!不胜感激!:)
首先,你要搞清楚,在下面代码中,
函数
foo
是作为函数表达式存在的,不是函数声明语句,为什么呢?因为有()
,()
把里面的函数声明语句变成了函数表达式,或者严谨些,解析器去解析的时候,会把()
里的当做表达式去解析,所以函数foo
是作为函数表达式存在的;当函数作为表达式来用的时候,函数可以有名称,在这里就是
foo
,但是这个函数名只存在于函数体内,是局部变量,指代函数本身;如图:js-权威指南
上的话:规范是这么说的:
按照前面的解释,
foo
是局部变量,只存在于函数体内,并不在全局作用域内;但是他跟函数里声明的局部变量又不太一样,这个我没有去搞清楚,暂时不影响理解;