作用域
在js中,作用域分为全局作用域、函数作用域与块级作用域(Es6新增的);
全局作用域
- 定义:直接编写在jscript标签中的js代码,都在全局作用域中;
- 全局变量:全局作用域中定义的变量被成为全局变量;
- 全局变量的生命周期:在页面打开时被创建,在页面关闭时被销毁;
- 全局变量的访问时机:全局变量在页面的任何位置都可以访问到;
- 在全局作用域中存在一个全局对象window,代表浏览器窗口;
- 使用var 定义的变量全部作为window的属性;
- 全局作用域中创建的函数全部作为window的方法;
函数作用域
- 定义:每当函数被创建的时候,都会产生一个函数作用域;
- 局部变量:函数作用域中定义的变量被称作局部变量;
- 局部变量的生命周期:函数调用时被创建,函数执行完毕被销毁;
- 局部变量的访问时机:仅在函数内部可以访问;
块级作用域
-
块级作用域是Es6新增的作用域类型;
-
定义:除对象的{}外,每一个{}都会生成一个块级作用域;
-
局部变量:在块级作用域内部使用let与const定义的变量被称为局部变量;
-
若是使用var关键字定义变量–js没有块级作用域!
-
若是使用let与const关键字定义变量–js存在块级作用域!
-
var name="global"; if(true){ var name="local"; console.log(name) // "local" } console.log(name); // "local"
-
const name="global"; if(true){ const name="local"; console.log(name) //"local" } console.log(name); //"global"
-
例1中解析过程
// 1.使用var定义变量存在变量提升,提升到当前作用域的最顶端; // 2.使用var定义变量不存块级作用域---因此这两次name变量提升都是提升到全局作用域的最顶端; var name name = "global" if(true){ name="local"; console.log(name) // local } if(true){ console.log(name) // global } console.log(name); // global
例2的解析过程
//1.使用let与const定义变量不存在变量提升; // 2.使用let与const定义变量存在块级作用域 const name="global"; if(true){ const name="local"; console.log(name) // 3.访问-发现块级作用域中存在name变量,访问块级作用域中的name变量 } if(true){ console.log(name) // 4.访问-发现块级作用域中不存在name变量,顺着作用域链向上一级作用域中寻找 }
-