搜索
写经验 领红包
 > 知识

js有哪些作用域分别是什么意思(javascipt作用域)

导语:JavaScript 作用域

作用域指的是您有权访问的变量集合。

解释下上面一句,就是说一个变量,你在某个范围内能够访问到,这个范围就叫做作用域。作用域是相对于变量(也会是函数,常量之类的)来说的。

JavaScript的作用域,就分三种:全局作用域,函数作用域,块级作用域。

1,全局作用域。
var a = 1;// 此处的代码能够使用 a 变量function func() {alert(a)    // 此处的代码也能够使用 a 变量}

在函数之外声明的变量,是全局变量。a的作用域就是全局作用域。网页的所有脚本和函数都能够访问它。

2,函数作用域。

函数作用域也叫做局部作用域。它所声明的变量,只能在该函数体内部使用。

  function func() {           var a = 1   }   console.log(a)  // a is not defined

这个a就叫做局部变量,它的作用域就是函数作用域。在这个函数之外,就不能使用它了。(注意: a前面如果没有var关键字,a会自动提升到全局作用域)

3,块级作用域。

块级作用域是ES6出来的新概念,之前是没有的。块级作用域的里面变量,要用let 关键字来声明。块级作用域,可以理解为{}(这个花括号排除函数)里面的变量。

if (true) {  let a = 1 // 使用let声明 }console.log(a) // a is not defined

上述变量a如果使用var关键字,则会自动提升到全局作用域。

a的作用域就是花括号里面这一块,a的作用域,就是块级作用域。

这个有点不好理解的是for循环,比如

for (let i = 0; i < 5; i++) {      console.log(i) // 0 1 2 3 4 }

按一般理解来说,for循环每一次循环花括号中,都应该是一个独立i,它是如何记住上次循环的i的呢。实际上for循环设置循环变量的那部分是一个父作用域,而循环体内部是一个单独的子作用域。子作用域可以访问父作用域里面的变量。也可以在子作用域中重新声明变量i

 for (let i = 0; i < 5; i++) {   let i = &39;   console.log(i) // 输出5次hi }
4,作用域链

作用域链,就是子级的作用域可以访问父级作用域里面的变量,父级没有,再向父级的父级去寻找,一直递归下去,直到全局作用域。

我们以块级作用域为例;

如果if里面没有声明a它会一层一层找到全局变量a

在浏览器中全局作用域的变量,会等页面关闭才会在内存中消失,而块级作用域和函数作用域,则会,在该代码块执行完毕后,立即销毁。我们要慎重声明全局变量。

本文内容由小梓整理编辑!