# JavaScriptAdvanced5 **Repository Path**: yxDeveloper/JavaScriptAdvanced5 ## Basic Information - **Project Name**: JavaScriptAdvanced5 - **Description**: Notes on the advanced part of JavaScript 5 - **Primary Language**: HTML - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-08-02 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # JavaScript高级第五天 ## 使用递归获取后代元素 ## 作用域 ### 什么是作用域 变量起作用的范围 ### 什么是块级作用域 JS(es5之前)没有块级作用域,使用代码块限定的作用域就是块级作用域 ### JS中的作用域叫做 词法作用域 this的是动态作用域 ### 词法作用域 代码写好的时候,就能确定变量的作用域,这种作用域就是词法作用域 动态作用域,(是词法作用域就不可能是动态作用域) 在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 function foo() { var num = 123; } ``` 5.变量提升是分块 ``` 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 = "数据2"; return { getData: function () { return data; }, getData1: function () { return data1; } } } ``` ```js function outer(){ var data = "数据"; return { getData: function() { return data; }, setData: function(value) { if(boolean){ throw ""; } data = value; return data; } } } ``` ## 闭包的作用 如果把数据放在全局作用域内,那么所有人都可以随意修改,这个数据就不再可靠。 闭包提供了一个私有的空间,在这个空间内部的数据,外部无法直接访问 外部空间想要访问内部的数据,只能通过闭包提供的指定函数或方法,在这个方法内部 可以设置一些校验规则,让数据变得更加的安全