JavaScript 中作用域与函数

在 JavaScript 中,作用域由函数决定( fucntion scope,lexical scope ),不是代码块( block scope )。

当我们声明一个函数时,我们不仅要关注该函数可用的作用域,还要关注该函数自身所创建的作用域,以及函数内部的声明是如何影响这些作用域的

JavaScript 的作用域行为,与受 C 语言语法影响的作用域不太一样,也就是那些使用括号({ })作为分隔符的语言。在大多数这样的语言中,每一个代码块都会创建自己的作用域,但在 JavaScript 中却并非如此!

在 JavaScript 中,作用域是由函数声明的,而不是代码块。声明的作用域创建于代码块,但不是终结于代码块,比如下面的代码:

name的作用域开始于var标记处,但却不是结束于大括号,而是结束于所在函数的结尾

要理解 JavaScript 中的作用域,需要记住三个要点:

  • 变量声明的作用域开始于声明的地方,结束于所在函数的结尾,与代码嵌套无关。
  • 命名函数的作用域是指声明该函数的整个函数范围,与代码嵌套无关(声明提前 mechanism hoisting)。
  • 对于作用域声明,全局上下文window就像一个包含页面所有代码的超大型函数。

所以我们使用匿名函数可以防止污染全局变量,因为我们把匿名函数中的声明的作用域限制在了匿名函数之内。

下图能帮你更直观的理解作用域:
scrop-function

相关文章:JavaScript的作用域链浅析

发表评论