前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >我理解的作用域

我理解的作用域

作者头像
wade
发布2020-04-24 11:21:34
2670
发布2020-04-24 11:21:34
举报
文章被收录于专栏:coding个人笔记coding个人笔记

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

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

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

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

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

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

代码语言:javascript
复制
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。

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

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

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

代码语言:javascript
复制
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中,函数声明是提前的,会移到顶部。

代码语言: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不报错。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-06-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 coding个人笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档