JavaScript复习之作用域与运行原理

【JS】你不知道的JavaScript 笔记(一)—— 作用域与闭包 - 编译原理 - LHS - RHS - 循环与闭包 - 模块 - 词法作用域 - 动态作用域 之前看了一遍《你不知道的JavaScript(上卷)》之后感觉醍醐灌顶,过了几个月又感觉都快忘了,今天准备边二刷,边做个笔记,把书中的一些重点思想记录整理下来,方便以后复习。 今天先来复习第一部分:作用域与闭包 阅读详情

作用域:
变量可以起作用的范围和区域。
不使用 var 声明的变量是全局变量,不推荐使用。
变量退出作用域之后会销毁,全局变量关闭网页或浏览器才会销毁

变量提升

console.log(a); // undefined
var a = 2;
console.log(a); //   a is not defined
  • 变量提升

    定义变量的时候,变量的声明会被提升到作用域的最上面,变量的赋值不会提升。

  • 函数提升

    JavaScript解析器首先会把当前作用域的函数声明提前到整个作用域的最前面

f();
function f(){
    console.log(12); //12
}
var f = 1;
function f(){
    console.log(12); //12
}
// 由于函数提升在前,所以被变量声明替换了;
// 执行阶段,变量被复制为1,不再是一个函数,
f(); // f is not a function

注:不管是普通变量还是函数,尽量不要出现重名;

JS代码的运行

console.log(s); //undefined
var s = 2;

JavaScript代码的执行是由浏览器中的JavaScript解析器来执行的。
JavaScript解析器执行JavaScript代码的时候,分为两个过程:预解析(编译)过程和代码执行过程

预解析过程:

  1. 语法检查,如果有错误,直接停止后续步骤不再运行。
  2. 把变量和函数的声明提升到当前作用域的最前面,只会提升声明,不会提升赋值和调用。
  3. 先提升变量后提升函数,如果函数和变量同名,则被替换;

代码执行过程

  • 变量的赋值,函数的调用,循环判断等,根据代码由上往下顺序执行;
var a = 25;
function abc (){
  alert(a);//undefined
  var a = 10;
}
abc();


// 如果变量和函数同名的话,函数会覆盖变量
console.log(a);
function a() {
  console.log('aaaaa');
}
var a = 1;
console.log(a);
// 1、----------------
var num = 10;
fun();
function fun() {
    console.log(num); //undefined
    var num = 20;
}

// 2、----------------
var a = 18;
f1();
function f1() {
    var b = 9;
    console.log(a); //undefined
    console.log(b); // 9
    var a = '123'; 
}

词法作用域

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

在 js 中词法作用域规则:

  • 函数允许访问函数外的数据.
  • 整个代码结构中只有函数可以限定作用域.
  • 作用域规则首先使用提升规则分析
  • 如果当前作用规则中有名字了, 就不考虑外面的名字
var num = 123;
function foo() {
  console.log( num );
}
foo();

if ( false ) {
    var num = 123;
}
console.log( num ); // undefiend

函数内部可以访问函数外部的变量,但是函数外部不可以访问函数内部的变量;

函数内部如果有变量,则优先使用内部的变量,如果函数内部没有,才会使用函数外部的变量;

作用域链

只有函数可以制造作用域结构, 那么只要是代码,就至少有一个作用域, 即全局作用域。凡是代码中有函数,那么这个函数就构成另一个作用域。如果函数中还有函数,那么在这个作用域中就又可以诞生一个作用域。

将这样的所有的作用域列出来,可以有一个结构: 函数内指向函数外的链式结构。就称作作用域链。

var a = 1;
function fn1(){
    function fn2(){
        function fn3(){
            console.log(a);
        }
        fn3();
    }
    fn2();
}
fn1();

//--------------------------------
var a = 1;
function fn1(){
    var a = 2;
    function fn2(){
        var a = 3;
        function fn3(){
            console.log(a);
        }
        fn3();
    }
    fn2();
}
fn1();
【前端知识之JS】JS的作用域链 本系列主要整理前端面试中需要掌握的知识点。本节介绍JS的作用域链。 阅读详情

相关推荐

IFIX往Mysql数据库同步数据方法

通过IFix数据库向Mysql数据库同步数据

仙人掌 1597

闭包和作用域

闭包和作用域作用域有关题目《一》《二》《三》闭包(隐藏变量,全局不能直接修改) 作用域有关题目 1、函数返回值由什么确定:调用时传的参数、函数定义时的环境(最近的作用域) 《一》 let x = 'x' let a= '1' function f1(x){ return x +a }; { let a = '2'; f1('x') //值为多少 } //值为 x1 调用时定义的环境是function f1 最近的作用域,如果是let a的值,则可直接通过参数传进 le

qq_43514454的博客 359

[捷稀 JCG Q30 Pro 刷机说明] 以刷入openwrt24.10为例

摘要: 本文详细介绍了捷稀JCG Q30 Pro路由器刷入OpenWrt 24.10系统的步骤。通过先刷入OpenWrt 23.05过渡固件,再升级Uboot,最后通过TFTP加载工厂镜像完成刷机。关键步骤包括解锁分区、刷写Uboot、进入恢复模式及配置网络。文章还提供了无线设置、Tailscale内网穿透等进阶命令,并附参考文档和固件下载链接。适用于有一定技术基础的玩家,需注意操作风险,严格按流程执行。

贤时间 7148

50.函数的作用域链

要搞清楚一个变量的作用域,重点是搞清楚预解析顺序,然后再判断作用域的范围,这些都是有套路可言:先找本层环境有无声明,有的话,看是否进行了赋值;只有声明没有执行赋值,就是undefined。没有声明也没有赋值的话,就再向上一层查找,直到找到为止。如果所有的执行环境都没有找到,那么控制台就会报错变量找不到。函数的话就更简单了:找本层环境是否有预解析的函数,有的话即可执行。没有的话还是向上查找。6.什么...

qq_36367494的博客 302

vasp计算练习1-Si

si的vasp训练流程

qq_41074165的博客 3301

STK轨道仿真环境搭建实战:从地月系到多天体场景

本文详细介绍了STK轨道仿真环境搭建的实战指南,从基础的地月系统到复杂的多天体场景。通过逐步操作说明和实用技巧,帮助用户快速掌握STK软件的使用方法,提升轨道仿真效率,适用于航天任务设计和教学演示。

weixin_30312563的博客 399

js的函数

函数 函数的声明: 第一种声明方式: function 函数名(){ 函数体 } 另一种表达方式: var 函数名=function(){ 函数体 } 调用函数 两种方式都可以使用,不过还是有一定的区别,当出现如下情况时 例1: f1();//调用函数 function f1(){ console.log("hhhh"); }/...

wow_tutou的博客 190

【附源码】Node.js毕业设计高校院级校友信息管理系统(Express)

首先,该系统可以提高高校对校友信息管理的效率和准确性。通过系统提供的查询功能,高校可以方便地获取校友的最新联系方式和动态,及时了解校友的发展情况,为校友提供更好的服务和支持。总之,开发高校院级校友信息管理系统将为高校提供一个高效、便捷的工具,有助于提升校友管理水平和服务质量,促进高校与校友之间的良好互动关系。通过使用前端技术HTML、CSS、JavaScript和Vue框架,结合后端技术Node.js和Express框架,以及MySQL数据库,可以实现对校友信息的快速录入、查询、修改和删除等操作。

佳愉毕设源码 894

ES6学习笔记(2)——let和const命令

let和const命令 let 声明的变量只在let命令所在的代码块内有效 { let a = 10; var b = 1; } a // ReferenceError: a is not defined. b // 1 for循环 for (let i = 0; i < 10; i++) {} console.log(i); //i is not defined 对比 //var声明时 var a = []; for (var i = 0; i < 10; i++) {

aaaaapipi的博客 276

群辉NAS映射为本地盘符

鼠标右击网络→映射网络驱动器→以上适合通过局域网操作,采用ZeroTier组网后,也可以按照以上步骤实现,这时使用 “虚拟局域网”的IP地址。

dgnankai的专栏 5777

【Qt开发教程】网络代理QNetworkProxy类详解及实战应用

QNetworkProxy 提供了一种灵活而强大的方式来配置和管理网络代理,通过设置代理类型、主机、端口和认证信息,可以使应用程序的所有网络请求通过代理服务器进行。结合 QNetworkProxyFactory 可以实现动态代理选择和自动配置,提高应用的网络通信能力和安全性。在实际应用中,通过合理设置代理、处理代理认证和错误情况,可以确保应用程序在复杂的网络环境中稳定运行,为用户提供可靠的网络访问体验。

科技改变人类,技术成就未来 1542

前端笔试题[1]

http://www.cnblogs.com/Candybunny/category/811557.html 闭包和this 一.闭包 最开始理解闭包是在一个函数内部定义一个函数,可以在外面的环境里进行调用。现在对于闭包的理解是利用函数来保存作用域内的对象。 理解闭包首先要理解执行上下文,变量对象,活动对象,作用域链。因为执行上下文在函数执行后会销毁,因

大灰狼的小绵羊哥哥的博客 986

ESP32S3 TLS 握手WIFI可用但是在蜂窝热点下卡死:排查方法与根因

设备卡在等。

摸鱼专家 87

JavaScript复习,this指向、原型链、变量提升、作用域、闭包

文章目录 函数中this指向问题 原型 变量/函数 提升 全局执行上下文: 测试题 var可重复声明 作用域 闭包 更深入理解闭包的原理 闭包的作用 终极题目 ES5的继承

ronghwa_lu 3782

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

JS函数作用域原理

本篇文章在于详细解读JavaScript的作用域,从底层原理来解释一些常见的问题,例如变量提升、隐式创建变量等问题,在和大家一起交流进步的同时,也算对自己知识掌握的记录,方便以后复习   首先,直接捡干的来,JS作用域大致分为三部分:词法作用域、函数作用域/块作用域、闭包。   在传统的编译语言中,程序的源代码编译由三个步骤组成:词法分析、语法分析、代码生成。而JS属于动态语言,它的编译过程不...

Kyrieee的博客 402

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【JavaScript复习十七】作用域以及变量提升

全网独播-价值千万金融项目前端架构实战从两道网易面试题-分析JavaScript底层机制RESTful架构在Nodejs下的最佳实践开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】一线互联网企业如何初始化项目-做一个自己的vue-cli思维无价,看我用Nodejs实现MVC代码优雅的秘诀-用观察者模式深度解耦模块前端高级实战,如何封装属于自己的JS库VUE组件库级组件封装-高复用弹窗组件。

2401_84411822的博客 738

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

JavaScript特性复习(三) 之 作用域及作用域链

作用域及作用域链 @ 作用域是根据名称查找变量的一套规则。 @ js一般来说,只有两种作用域,一种是全局作用域,一种是函数作用域 聊到js的 作用域,就不得不聊到js中的作用域链。作用域链的用途是:保证对执行环境有权访问的所有变量和函数的有序访问,本质是一个指向变量对象的指针列表,那是什么又是变量对象? 这里要引入一个极为重要的概念:**执行环境(execution context)**也称 执行上下文 执行环境定义了变量或函数有权访问的其他数据,每个执行环境都有一个与之关联的变量对象,

weixin_44162337的博客 239

详解JS 作用域与作用域链、IIFE模式、js执行过程

详解JS 作用域与作用域链、IIFE模式、js执行过程

Baby_加油_的博客 1468

js变量、作用域和内存问题的复习**

基本类型和引用类型 基本类型指的是简单的数据段,引用类型指那些可能由多个值构成的对象。引用类型的值是保存在内存中的对象。在实际操作中,实际上是在操作对象的引用而不是实际的对象,因此引用类型的值是按引用访问的 js变量的访问有按值和按引用两种,而参数的传递是按值传递的 s所有函数的参数都是按值传递的,也就是把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。基本类型值的

sqliang的专栏 1317

Javascript作用域、闭包原理以及性能问题

这可能是每一个jser都曾经为之头疼的却又非常经典的问题,关系到内存,关系到闭包,关系到javascript运行机制。关系到功能,关系到性能。 文章内容主要参考自《High Performance JavaScript》,这本书对javascript性能方面确实讲的比较深入,大家有空都可以尝试着阅读一下,我这里有中英电子版,需要的话QQ317665171或者QQ邮箱联系。 复习,笔记,更深入的

han8888的专栏 681

JavaScript中的作用域和预解析

回顾 上一篇中我们主要说了 js 的函数,牵扯到函数的概念与使用,以及函数的传参和调用等方面的内容,函数是js中最具代表意义的功能,也是未来十分常用技术点。文章内容都是非常之基础,如果想了解深入建议多看看红宝书等书籍。 这篇中我们要说一下 js 中的作用域和预解析,对于正常思维考量,你一定会觉得这部分内容会有不解,特别是针对预解析的内容,但是没关系,你可以尝试的多了解了解 js 的发展历程等原因会发现语言的发展绕不开它本身当下的环境和所处时代等多种因素。 作用域 作用域:是代码名字(变量)在某个范围内起到的

夸克IT 931

js之函数作用域

、、、、、、、、、、、仅对以前所学做复习记录使用、、、、、、、、、 在调用函数时,调用时哈,函数作用域被创建;当函数执行完毕时,函数作用域销毁。 在函数中声明并赋值一个变量 一、在函数中声明的变量是外部是不能访问的。 二、全局变量是可以在函数中访问。 三、当函数调用的时候,是调用的时候哈,每调用一次函数,就会生成一个新的函数作用域,相互独立且不影响。 四、函数作用域链:函数先在自身找变量,找不到时,就会找函数的父函数,父函数中没有就找爷爷函数,以此类推,直到找到window全局作用域。如果都没有只能报

我心坚持 1843

《你所不知道的JavaScript》(上册)知识复习梳理

注:该文章由我幕布笔记转移过来,其中有不少我博客链接 作用域 JavaScript编译原理 词法单元—(汇成)—词法单元流—(解析/语法分析)AST(代码生成)—可执行代码 变量出现在赋值操作左侧进行LHS查询,右侧则RHS查询,LHS找源,RHS找目标 作用域嵌套 规则就是找不到就向上找 异常(非严格模式下LHS和RHS的做法,以及严格模式下的做法) 动态作用域 动态作用域是指在函数调用时,JavaScript 会根据函数调用的 执行顺序 来确定作

qq_55018264的博客 729

JS进阶-作用域

定义:局部作用域的意思就是,变量只能在它的代码块或者函数内部访问,而不能在外部访问,局部作用域的变量在函数或代码块执行完后会销毁,不会影响全局作用域变量。

吃猫的鱼 938

理解JS作用域笔记(完):声明提升、作用域链

开头 笔记视频内容源自B站JavaScript从入门到放弃 第九章 深入理解JS作用域,笔记为自行整理复习使用,欢迎一同学习交流,转载请通知原作者 三、声明提升 3.1、变量声明提升 先看一段代码: <body> <script> //没有编译阶段 边解释边执行 a = 2; var a; console.log(a); </script> </body> 从直观的角度看,js代码的执行是从

干巴爹兔的博客 387

JS复习8:作用域

JS复习8:作用域 一、JS中的作用域 // 1.JavaScript作用域 : 就是代码名字(变量)在某个范围内起作用和效果 目的是为了提高程序的可靠性更重要的是减少命名冲突 // 2. js的作用域(es6)之前 : 全局作用域 局部作用域 // 3. 全局作用域: 整个script标签 或者是一个单独的js文件 var num = 10; var num = 30; console.log(num); // 4. 局部作用域(函数作用域) 在函数内部就是局部作用域 这个代码的名字只在函数内部起

好汤圆的博客 314
上一篇: JavaScript复习之函数
下一篇: JavaScript复习之内置对象
HansMa
博客等级 码龄12年 24粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值