看你不知道的javaScript时看到一个关于函数作用域的问题不是很理解

书第一册p27中说到

区分函数声明和表达式最简单的方法是看 function 关键字出现在声明中的位
置(不仅仅是一行代码,而是整个声明中的位置)。如果 function 是声明中
的第一个词,那么就是一个函数声明,否则就是一个函数表达式。

函数声明和函数表达式之间最重要的区别是它们的名称标识符将会绑定在何处。

(function foo(){ .. }) 作为函数表达式意味着 foo 只能在 .. 所代表的位置中
被访问,外部作用域则不行。foo 变量名被隐藏在自身中意味着不会非必要地污染外部作
用域

也就是说一个函数function如果不是声明中第一个词,那个就是一个函数表达式,同时函数名被隐藏在自身作用域中,外部不可访问
我试了下

(function foo(){
    console.log(1)
})

foo()

这样会报错,foo不可访问
但是如果我把(换成{,按理说依旧不是function开头的,但是我在外部任然可以访问到foo
同时还有不明的就是就算是函数表达式那么在执行是这个foo应该是存在与作用域中的,为何加上( 就被隐藏了,(是没有形成新作用域的能力的啊

阅读 1.2k
1 个回答

{}解释为一个块语句,()包裹的是表达式
比如你有可以这么写

{
  var a = 1
}
console.log(a)

这种写法常见于各类库

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