javascript的作用域以及闭包现象
Posted jason-lin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javascript的作用域以及闭包现象相关的知识,希望对你有一定的参考价值。
1、 词法作用域
词法作用域就是定义在词法阶段的作用域,换句话说,也就是js的作用域时在定义阶段决定的,和调用无关。
1.1 作用域沿着作用链向上查找
<!DOCTYPE html> <html> <head> <title></title> </head> <body> </body> <script type="text/javascript"> //引擎执行console.log();在bar()内找不到a,向上查找,foo()也找不到,继续向上查找,在window全局中查找,找到a; function foo(){ var b = a*2; function bar(c){ console.log(a,b,c) // 2 4 8 } bar(b*2); } var a =2; foo(2) </script> </html>
1.2 函数作用域,定义函数时,会创建自己的气泡(作用域),外部作用无法直接访问。
1.3 立即执行函数 IIFE(Immediately Invoked Function Expression)
<!DOCTYPE html> <html> <head> <title></title> </head> <body> </body> <script type="text/javascript"> var a = 100; (function foo(){ var a =1; console.log(a); })() console.log(a); //100 </script> </html>
1.4块级作用域
javascipt没有块级作用域,块级定义的变量会污染上一级作用域
<!DOCTYPE html> <html> <head> <title></title> </head> <body> </body> <script type="text/javascript"> for(vart i=1; i<10; i++){} console.log(i); //10 </script> </html>
1.5 let语法
es6引入let语法可以解决js没有块级作用域问题,强行绑定所在作用域
<!DOCTYPE html> <html> <head> <title></title> </head> <body> </body> <script type="text/javascript"> for(let i=1; i<10; i++){} console.log(i); //报错 </script> </html>
1.6 变量提升
以上是关于javascript的作用域以及闭包现象的主要内容,如果未能解决你的问题,请参考以下文章