为什么立即执行函数不能在其所在的作用域访问它?

我在看《你不知道的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函数作用域,也就是属于函数自身的作用域?

希望走过路过的大神指点一二!不胜感激!:)

阅读 2.2k
2 个回答
(function foo(){
    console.log('函数内部:'+foo);//打印出这个函数体
})();

console.log('函数外部:'+foo);//报错。Uncaught ReferenceError: foo is not defined
1、为什么foo被绑定在函数表达式自身的函数中?

首先,你要搞清楚,在下面代码中,

(function foo(){
        console.log('函数内部:'+foo);//打印出这个函数体
    })

函数 foo 是作为函数表达式存在的,不是函数声明语句,为什么呢?因为有(),()把里面的函数声明语句变成了函数表达式,或者严谨些,解析器去解析的时候,会把()里的当做表达式去解析,所以函数 foo 是作为函数表达式存在的;

当函数作为表达式来用的时候,函数可以有名称,在这里就是 foo,但是这个函数名只存在于函数体内,是局部变量,指代函数本身;如图:js-权威指南上的话:

clipboard.png

规范是这么说的:

clipboard.png

2、foo属于哪个作用域?

按照前面的解释,foo 是局部变量,只存在于函数体内,并不在全局作用域内;

但是他跟函数里声明的局部变量又不太一样,这个我没有去搞清楚,暂时不影响理解;

新手上路,请多包涵

(function foo(){console.log('函数内部:'+foo);//打印出这个函数体})(); //后面还有对括号

(function foo(){...})();这个是立即执行函数吧,他会隔绝作用域的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题