作用域
变量起作用的范围就是变量的作用域
块级作用域
JavaScript中没有块级作用域
如果有块级作用域下面的代码的显示结果为 undefined undefined
1 | // for(var i=0; i<10;i++){ |
词法作用域
就是在代码写好的那一刻,变量的作用域就已经确定了,这种作用域,就是所谓的词法作用域
和词法作用域相对的叫动态作用域 js中是词法作用域不是动态作用域
1 | var num = 123; |
1 | ### 在JavaScript中唯一能产生作用域的东西是 函数! |
词法作用域的规则
函数允许访问函数外的数据.
//整个代码结构中只有函数可以限定作用域.
//作用域规则首先使用提升规则分析
//如果当前作用域中有了该变量, 就不考虑外面的同名变量
变量和函数提升
js代码的执行分为两个步骤
预解析
1 | //提升(hoisting) |
作用域链
只要是函数就可以创造作用域
函数中又可以再创建函数
函数内部的作用域可以访问函数外部的作用域
如果有多个函数嵌套,那么就会构成一个链式访问结构,这就是作用域链
1 | //f1--->全局 |
变量与作用域
1 设置值的时候,也是访问变量
2. 获取值的时候,是访问变量
3.并不是在函数内部写了变量,这个变量就属于这个函数的作用域,
// 而是必须使用var来声明变量,这个变量才会属于这个作用域
/函数在声明出来的时候,里面的代码不会执行,
//只有在调用的时候,代码才会执行
声明函数时的函数名,其实也是一个变量名
//可以通过这个变量名来给其赋值
变量搜索原则
1.在使用变量的时候
//* 首先在所在的作用域中查找
//* 如果找到了 就直接使用
//* 如果没有找到 就去上级作用域中查找
重复以上步骤
//* 如果直到0级作用域链也就是全局作用域还没有找到,报错
闭包
1.什么是闭包
一个具有封闭的对外不公开的, 包裹结构, 或空间
2、js中的闭包
就是函数
3、闭包的原理就是作用域访问原则
1 | //上级作用域无法直接访问下级作用域中的变量 |
4.闭包要解决什么问题?
1 | //1.闭包内的数据不允许外界访问 |
闭包的作用
在函数外部想要修改数据
只能通过函数内部的方法
我们可以在函数内部定义的这个方法里
设置安全措施,校验之类的操作
可以保证系统的安全性和稳定性
最基本的作用:可以通过闭包返回的函数或者方法,来修改函数内部的数据
创建一个私有的空间,保护数据
外部想要访问数据,只能通过函数提供的方法
在提供的方法中,我们可以设置一些校验逻辑,让数据变得更加安全
使用闭包获取多个数据并设置值
1 | function foo() { |
作用域分段
1 | <script> |
条件式函数声明
1 | //条件式函数声明是否会被提升,取决浏览器 |