专栏首页coding个人笔记我理解的作用域

我理解的作用域

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

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

for(var i = 0;i < 1;i++){
 var a = 1;
}
if(9){
 var b = 2;
}
console.log(a);//输出1
console.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个人笔记(gh_2ce38b49dae1),作者:wade

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-06-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 初识promise

    new Promise( function(resolve, reject) { } );

    wade
  • 简写js的积累

    写js的时候,有很多小技巧可以让我们的代码更整洁,只是我们都不注意积累,先上几个自己平时用的,以后慢慢积累。

    wade
  • ES6之Set和Map数据结构

    ES6提供了新的数据结构Set,类似数组,元素值都是唯一的,不能重复。Set本身就是一个构造函数。

    wade
  • 搞明白JavaScript中的匿名函数

    到此,你会发现单独运行一个匿名函数,由于不符合语法要求,报错啦!解决方法只需要给匿名函数包裹一个括号即可:

    用户1272076
  • 前端基础-JavaScript作用域与JS代码的运行

    变量的作用域是在定义时决定而不是执行时决定的,也就是说词法作用域取决于编译阶段,通过静态分析就能确定,因此词法作用域也叫做静态作用域。

    cwl_java
  • 魔改有道云笔记

    C:\Users\你的用户名\AppData\Local\youdao\ynote\

    Jetpropelledsnake21
  • 图片等比例缩放方案

    在Web开发时无可避免的需要将图片进行缩放,缩放时需要保证图片不变形,也就是需要等比例缩放。

    WindrunnerMax
  • GAIAWORLD设计CPoS共识机制的原理何在?

    从技术层面来说,目前区块链发展的最大制约因素在于底层技术存在着很严峻的技术瓶颈(吞吐量,安全性,兼容性等)。这些问题尚未得到很好的突破,因此大部分的应用都无法落...

    GAIAWorld
  • Python设计模式(8):外观模式

    外观一词来自于英文词语 Facade,这个词用来表示一个建筑物的外观,而隐藏了其内部的细节。外观模式(Facade Pattern)用来隐藏一个软件系统的所有内...

    不可言诉的深渊
  • 【ES基础】let和作用域

    ECMAScript是一种由Ecma国际(前身为欧洲计算机制造商协会)以JavaScript为基础制定的一种脚本语言标准。目前,该标准基本上每年发布一次新的ES...

    前端达人

扫码关注云+社区

领取腾讯云代金券