js学习笔记之高级--作用域+作用域链+闭包
2018-03-17 19:33
218 查看
作用域 什么是作用域 变量起作用的范围 什么是块级作用域 JS中没有块级作用域,使用代码块限定的作用域就是块级作用域 JS中的作用域叫做 词法作用域 词法作用域 在代码写好的时候,就能确定变量的作用域,这种作用域就是词法作用域 动态作用域.(是词法作用域就不可能是动态作用域) 在js当中,只有函数能创造作用域 var num = 123; function f1(){ console.log(num); //如果是动态作用域打印的就是456 如果是词法作用域 打印123 } function f2(){ var num = 456; f1(); } f2(); 变量提升 JS代码的运行分两个阶段 * 预解析阶段 * 变量名和函数提升 将var声明的变量名和function开头的函数进行提升 提升到当前作用域的最上方 * 执行阶段 注意: 1.变量和函数同名的时候 只提升函数,忽略变量名 2.函数同名的时候 都提升,但是后面的函数会覆盖前面的函数 3.函数表达式,只会提升变量名,不会提后面的函数 4.变量提升只会将变量和函数提升到当前作用域的最上方 ```js funciton foo(){ var num =123; } ``` 5.变量提升是分块 <script> 的 ```html <script> foo() function foo(){ console.log("第一个script标签内的函数") }; </script> <script> foo() function foo(){ console.log("第2个script标签内的函数") } </script> ``` 6.条件式函数声明 能否被提升,取决于浏览器, 不推荐使用!!! ``` foo();//会报错,因为未被提升 if(true){ function foo(){ } } ``` 作用域链 只要是函数都有作用域,函数内部的作用域可以访问函数外部的作用域 当多个函数嵌套的时候,就会形成一个链式的结构,这个就是作用域链 绘制作用域链图的步骤 1.先绘制0级作用域链 2.在全局作用域中查找,变量和函数的声明,找到之后,将所有的变量和函数用小方格放在0级作用域链上 3.再从0级作用域链上的函数引出1级作用域链 4.再去每一个1级作用域链中查找变量和函数的声明,找到之后..... 5.以此重复,就画好了整个作用域链 变量的搜索规则 1.首先在访问变量的作用域中查找该变量,如果找到直接使用 2.如果没有找到,去上一级作用域中继续查找,如果如果找到直接使用 3.如果没有找到,继续去上一级作用域中继续查找,直到全局作用域 4.如果找到了就用,如果没有直到就报错 闭包 闭包是什么 一个封闭的对外不公开的包裹结构或空间 js中的闭包是函数 闭包要解决的问题 1、在函数外部访问不到函数内部的数据 2、要解决的问题就是需要在外部间接的访问函数内部的数据 闭包的基本结构 ```js function outer(){ var data = "数据"; return function(){ return data; } } ``` ```js function outer(){ var data = "数据"; var data1 = "数据1"; return { getData:function(){ return data; }, getData1:function(){ return data1; } } } ``` ```js function outer(){ var data = "数据"; return { getData:function(){ return data; }, setData:function(value){ data = value; return data; } } } ``` 闭包的作用 如果把数据放在全局作用域内,那么所有人都可以随意修改,这个数据就不再可靠。 闭包可以创建一个私有空间,在这个空间内部的数据,外部无法直接访问 外部空间想要访问函数内部的数据,只能通过闭包提供的指定的方法,在这个方法内部 可以设置一些校验规则,让数据变得更加的安全。
相关文章推荐
- 《js高级程序设计》学习笔记--4.变量、作用域和内存问题
- JS高级程序设计学习笔记——继承
- js-JavaScript高级程序设计学习笔记21 改善JavaScript性能的方法
- [js]javascript高级-学习笔记
- js-JavaScript高级程序设计学习笔记18
- JavaScript高级程序设计(第3版)学习笔记8 js函数(中)
- JavaScript高级程序设计(第3版)学习笔记3 js简单数据类型
- js-JavaScript高级程序设计学习笔记7
- JavaScript高级程序设计(第3版)学习笔记4 js运算符和操作符
- js学习笔记之作用域
- JavaScript高级程序设计学习笔记一在HTML中使用JS
- js高级程序设计学习笔记之一
- js-JavaScript高级程序设计学习笔记8
- JavaScript高级程序设计(第3版)学习笔记6 初识js对象
- js-JavaScript高级程序设计学习笔记10
- 作用域2—JS学习笔记2015-6-10(第54天)
- js-JavaScript高级程序设计学习笔记2
- JavaScript高级程序设计 学习笔记 js高级技巧
- js-JavaScript高级程序设计学习笔记4
- JavaScript高级程序设计(第3版)学习笔记5 js语句