博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
我理解的作用域
阅读量:6159 次
发布时间:2019-06-21

本文共 1387 字,大约阅读时间需要 4 分钟。

JavaScript开发中,作用域算是难点和一大核心,作用域的理解很深,我可能会另外再写一些,先写一下目前为止理解到的层次。

JavaScript中,是没有块级作用域的,你在if或者for里面声明了一个变量,在外面还是能使用。

for(var i = 0;i < 1;i++){    var a = 1;}if(9){    var b = 2;}console.log(a);//输出1console.log(b);//输出2复制代码

JavaScript中采用函数作用域,每个函数都算是自己的一个作用域。

function fun() {    var a = 1;}fun();console.log(a);//报错Uncaught ReferenceError: a is not defined。复制代码

函数有一个作用域链,执行的时候从内向外层层寻找。

function fun1() {    var a = 1;    function fun2() {       var a = 2;       function fun3() {           var a = 3;           console.log(a);       }       fun3();    }    fun2();}fun1();复制代码

输出3,如果fun3里面没有定义a,那么向外寻找输出2,如果fun2里面没有定义a,继续向外寻找输出1,要是还没有,那么久报错undefined。

在执行方法前,作用域链是早就创建的。

function fun1() {    var a = 1;    function fun2() {       console.log(a);    }    a = 3;    return fun2;}fun1()();复制代码

如果没有a = 3,那么输出的就是1,因为有了a = 3,那么输出就是3,因为在执行方法之前,整个作用域链是已经创建完毕的。上面执行其实等价于

function fun1() {    var a = 1;    function fun2() {       console.log(a);    }    a = 3;    return fun2;}var fun = fun1();fun();复制代码

执行fun = fun1();的时候,a已经为1替换成3了,再执行fun();就输出了3。

JavaScript中,函数声明是提前的,会移到顶部。

function fun() {    console.log(a);}fun();复制代码

会报错Uncaught ReferenceError: a is not defined。

function fun() {    console.log(a);    var a = 3;}fun();复制代码

会输出undefined,而不是报错,我们都知道,输出undefined是没有赋值,所以可以表明a的声明已经移到了顶部,但是赋值的操作却是留在了原地,所以输出undefined不报错。

欢迎关注 Coding 个人笔记 公众号

转载于:https://juejin.im/post/5c47dfa8e51d45517625076f

你可能感兴趣的文章
[转]React 教程
查看>>
拓扑排序介绍
查看>>
eclipse打开工作空间(workspace)没有任务反应
查看>>
使用Sybmol模块来构建神经网络
查看>>
字符串去分割符号
查看>>
WPF中,多key值绑定问题,一个key绑定一个界面上的对象
查看>>
UML类图简明教程
查看>>
java反编译工具(Java Decompiler)
查看>>
Android开发之自定义对话框
查看>>
微信Access Token 缓存方法
查看>>
Eclipsed的SVN插件不能识别之前工作空间的项目
查看>>
Linux 查看iptables状态-重启
查看>>
amazeui学习笔记一(开始使用2)--布局示例layouts
查看>>
c#中lock的使用(用于预约超出限额的流程)
查看>>
ODI基于源表时间戳字段获取增量数据
查看>>
并发容器之CopyOnWriteArrayList(转载)
查看>>
什么是AAC音频格式 AAC-LC 和 AAC-HE的区别是什么
查看>>
原创:goldengate从11.2升级到12.1.2
查看>>
Quartz
查看>>
正则表达式的语法规则
查看>>