JavaScript-ECMAScript之作用域
Posted cuner
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript-ECMAScript之作用域相关的知识,希望对你有一定的参考价值。
- 作用域定义和作用
作用域定义:javascript中存储变量和查找变量的一套规则。
JavaScript中一般遵循词法作用域。
变量查找遵循从内到外查找:
引擎从当前的执行作用域开始查找变量,如果找不到就向上一级继续查找。当抵达最外层的全局作用域时,无论找到还是找不到,查找过程都会停止。
- 词法作用域
定义在词法阶段的作用域。是在写代码的时将变量和块作用域写在哪里来来决定的。
- 作用域的产生
JavaScript中没有块状作用域的概念。那么什么是块状作用域呢 简单说就是{..}括起来的区域就是一个最小单元的块。
我们可以简单 回顾一下c#或者Java语言中变量的作用域和申明周期 一般情况下是这样的
变量的作用域:
作用域从变量定义的位置开始,到该变量所在的那对大括号结束;
生命周期:
变量从定义的位置开始就在内存中活了;
变量到达它所在的作用域的时候就在内存中消失了;
举一个最简单的例子 for循环
C#中 for中定义的i 变量在 循环外访问不到
JavaScript 中在for循环外 可以正常访问
那么JavaScript 在什么时候创建作用域呢
- 全局作用域
这个无需做过多的解释,相信大家都理解
2. 函数
javaScript中每创建一个函数都会为其自身创建一个作用域气泡。属于这个函数的所有变量可以在整个函数内部使用及复用
- 块状作用域
上面说了js中没有块状作用域,但是凡是有例外,js中有几种情况可以提供块状作用域的效果
1: Try/catch
Catch 分句会创建一个块状作用域,其中声明的变量仅在catch内部有效
try{
undefined();
}catch(err){
console.log(err); // 能够访问
}
console.log(err); //这里访问不到了,ReferenceError: err not found
2: Let
Let 可以将变量的作用域绑定在所在的 {…}块状作用域中
Var foo=true;
If(foo){
Let bar=foo*2;
Console.log(bar); //正常访问
}
Console.log(bar); // ReferenceError
l 使用 let 进行的声明不会再块状作用域中进行提升。
{
Console.log(bar);// ReferenceError
Let bar=2;
}
3:Const
Const 也会创建块状作用域,但是它的值是固定的,之后任何试图修改的操作都会引起错误。
- 作用域提升
函数声明和变量声明会提升。而赋值或其他运行逻辑会留在原地。当函数声明和变量声明同时出现时,函数会首先被提升,然后才是变量。
函数表达式不会被提升
作用域提升会被提升到所在块状作用域的的顶部,即所在{…}的顶部
<script type="text/javascript"> foo(); //访问不到 // var a=true; { foo(); //可以访问得到 function foo(){ console.log("a"); } } </script>
- 作用域闭包
- 立即执行函数
- 欺骗词法作用域
以上是关于JavaScript-ECMAScript之作用域的主要内容,如果未能解决你的问题,请参考以下文章
javascript数据类型--- 函数对象之作用域和作用域链