作用域 什么是作用域 变量起作用的范围 什么是块级作用域 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学习笔记之高级--作用域+作用域链+闭包
最新推荐文章于 2023-04-06 09:41:49 发布