全局作用域
- 在<script></script>标签里,即为全局作用域。
- 在函数体以外,<script>标签内声明的变量就是全局变量。
全局作用域内的变量能够在任何其他的作用域接见和修正。
<script> vara = 0; function func1(){ a = 1; console.log(a); console.log(b); }; func1(); // 1 b is not defined </script> <script> varb = 2; func1(); // 1 2 </script>
部分作用域
- 一个函数体就是一个新的部分作用域。
- 函数内部定义的变量在部分作用域内。
- 函数外部作用域不能接见内部作用域的变量。
每一个函数有差别的作用域,在其他函数中是不能够接见的(一个函数接见另一个函数变量的时刻,经由过程通报参数)。
<script> function func1(){ var a = 0; }; function func2(){ var b = 2; console.log(b); console.log(a); }; func2(); // 2 a is not defined console.log(b); // b is not defined </script>
作用域链
- 函数作用域内里接见一个变量,先从本身最先找,假如没有,就顺次往上一级作用域查找,直到全局作用域,全局作用没有就报错。
当我们处于某一个作用域内里,修正某个变量值的时,先修正本身作用域,假如没有就顺次修正上一个作用域。
<script> var a = 10; var b = 30; function func(){ var a = 20; // 声明部分变量a a = 2; // 转变部分变量a b = 3; // 本作用域中无b变量,会顺次变动上层作用域中的变量 c = 4; // 给未被声明的变量赋值,会泄漏带window中 d = 5; // (未报错?)本作用域中无d变量,会顺次变动上层作用域中的变量,悉数没有则报错 console.log(a); }; console.log(b); // 30 全局变量b // console.log(c); // c is not defined func(); // 2 部分变量a console.log(a); // 10 全局变量a console.log(b); // 3 被基层作用域修正的变量b console.log(c); // 4 被泄漏到window中的变量c </script>
delete
删除未声明的变量,然则不能够删除已声明的变量
<script> var a = 10; b = 30; delete a; delete b; console.log(a); // 10 console.log(b); // b is not defined </script>
块作用域(ES6新增)
- let , const 不仅仅是声明变量的区分,它们另有支撑块作用域的机制(注重:不是大括号,if,switch,for发生的块)
let,consts声明的变量不会泄漏到顶层对象,只能声明以后再运用,var能够先赋值,在声明
<script> if(true){ var a = 10; let b = 20; const c = 30; }; console.log(a); // 10 console.log(b); // b is not defined console.log(c); // b is not defined </script>
注重
多个作用域题目
<div>1</div> <div>2</div> <div>3</div> <div>4</div> <div>5</div> <script> var aDiv = document.getElementsByTagName("div"); for(var i = 0; i < 5; i++){ aDiv[i].index = i; // 处理i运用var声明时,在函数作用域中的变量i一向是末了实行效果的题目 aDiv[i].onclick = function(){ console.log(i); // i运用var声明,效果一向都是5, i运用let声明,效果是0 1 2 3 4 // 函数体和for轮回不处于同一个作用域,需等前一个作用域实行完,才会实行本作用域 console.log(this.index); // 0 1 2 3 4 } } </script>