js高级02变量提升、闭包(1)

Oracle OCP 19c 认证1Z0-083考试大纲(Oracle官方版) Oracle Database: Managing Multitenant Architecture Ed 1 course 阅读详情

变量提升机制
1.数据值操作机制

2.变量提升机制
+什么是变量提升
+带var和不带的区别
+等号左边变量提升
+条件判断下的变量提升
+重名问题的处理

3.ES6中let不存在变量提升
+不允许重复定义
+暂时性死区
+不存在变量提升

1.为什么一般都把Js放到body的末尾
2.放在HEAD中可个可以?如何双到HEAD中也可以大境山从PDi/的效果?
3.SCRIPT标签中有两个属性: defer / async 的作用

1.js数据操作(渲染)

复习
var a = 12的过程
1. 先声明一个变量a,没有赋值(默认值是undefined)
2. 在当前作用域中开辟一个位置存储12这个值
3. 让变量a和12关联在一起(定义:赋值)

var a = 12


var b = a;
b = 13;
console.log(a);//12

var ary1 = [12, 23];
var ary2 = ary1;
ary2.push(100);
console.log(ary1);//[12,23,100]

在这里插入图片描述

任意数求和

 console.log(sum('10', 10, 20, 'AA'));

 function sum() {
     var total = 0;
     for (var i = 0; i < arguments.length; i++) {
         if (isNaN(arguments[i]) == false) {
             total = total + parseFloat(arguments[i]);
         }
     }
     return total;
 }

在这里插入图片描述

2.js变量提升(ES3/ES5)

  console.log(a);    输出undefined,不会报错
  var a =12;

变量提升:==当栈内存(作用域)形成之后,JS代码自上而下执行之前,==浏览器首先会把所有带 “var”/“function” 关键词的进行提前 “声明” 或者 “定义” ,这种预先处理机制称之为 “变量提升”

声明(declare):var a (默认值undefined)
定义(defined):a=12 (定义其实就是赋值操作)

[变量提升阶段]
带“var”的只声明未定义
带“function”的声明和赋值都完成了

变量提升只发生在当前作用域(例如:开始加载页面的时候只对全局作用域下的进行提升,因为此时函数中存储的都是字符串而己)

在全局作用域下声明的函数或者变量是"全局变量”,同理,在私有作用域下声明的变量是"私有变量“

浏览器很懒,做过的事情不会重复执行第二遍,也就是,当代码执行遇到创建函数这部分代码后,直接的跳过即可(因为在提升阶段就已经完成函数?的赋值操作了)

执行顺序

1.形参赋值2.变量提升 3.代码执行(私有作用域)

全局变量提升阶段
var a;var b;sum=0X88888(堆内存地址空间)


-----------------------------------------------
1.形参赋值2.变量提升 3.代码执行(私有作用域)
私有变量提升阶段 
sum()函数

var total;var i; var item;

--------------------------------------------------------------
var a = 12
var b = a;
b = 13;
console.log(a);//12

var ary1 = [12, 23];
var ary2 = ary1;
ary2.push(100);
console.log(ary1);//[12,23,100]

console.log(sum('10', 10, 20, 'AA'));

function sum() {
    var total = 0;
    for (var i = 0; i < arguments.length; i++) {
        if (isNaN(arguments[i]) == false) {
            total = total + parseFloat(arguments[i]);
        }
    }
    return total;
}

在这里插入图片描述

3.js带var和不带var的区别

全局变量

加var的本质是变量,存在变量提升
不加var的本质是window的属性,不存在变量提升

全局变量和window中的属性存在映射机制(一个改变另一个也改变)

加var

在全局作用域下声明一个变量,也相当于给window全局对象设置了一个属性,变量的值就是属性值
(私有作用域中声明的私有变量和window没啥关系)

console.log(a);     有属性a,由于变量提升机制,没有赋值 undefined
console.log('a' in window);  true  在变量提升阶段,在全局作用域中声明了一个变量A,此时就已经把A当做属性赋值给window了,只不过此时还没有给A赋值,默认值uindefined

console.log(window.a);     有属性a,由于变量提升机制,没有赋值 undefined
var a = 12;       全局变量值修改,wIN的属性值也跟着修改
console.log(a);    全局变量A  12
console.log(window.a);    window的一个属性名A 12

全局变量和window下的属性存在映射机制

不加var,给window对象新增属性

  console.log(a);  //Uncaught ReferenceError: a is not defined
  console.log('a' in window);//false

  console.log(window.a);  //undefined
  a = 12;     //等价于window.a = 12  //给window添加属性a  
  console.log(a);  //12
  console.log(window.a); //12
var a= 12,b = 13;   这样写b是带var的

var a = b = 12 ;    这样写b是不带var的,a是带var
等价于var a=12; b=12;

私有变量

私有作用域中带var和不带也有区别:

1.带var的在私有作用域变量提升阶段,都声明为私有变量,和外界没有任何的关系
2.不带var不是私有变量,会向它的上级作用域查找,看是否为上级的变量,不是,继续向上查找,一直找到window为止(我们把这种查找机制叫做:“作用域链”)
3.在私有作用域中操作的这个非私有变量,是一直操作别人的


console.log(a, b);//undefined、undefined
var a = 12, b = 12;
function fn() {
    console.log(a, b);  //undefined、12
    var a = b = 13;/*var a=13;  b=13*/
    console.log(a, b);  //13,13
}
fn();
console.log(a, b); //12,13

在这里插入图片描述

4.js作用域链的扩展

ES5 var

function fn() {
    var a = 12;
    b = 13; // 在作用域链查找的过程中,如果找到win也没有这个变量,相当于给win设置了一个属性B,(window.b=13)
    console.log('b' in window);    //true


    console.log(a, b);//12 13
}
fn();
console.log(b);  //13
console.log(a);  //Uncaught ReferenceError: a is not defined

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ES6 let

 let a = 12;
 console.log(a, window.a);//12 undefined

5.只对等号左边变量提升

sum();  可以正常执行,因为存在变量提升。在代码没执行前,在全局作用域中将sum()函数声明+定义

console.log(fn);  undefined

变量提升 var fn;
fn();//报错 fn is not a function  

匿名函数函数表达式(常用)
var fn = function () {//只对等号左边变量提升
    console.log(11);
}

普通函数
function sum() {
    console.log(22);
        }
AnolisOS网卡驱动源码编译与安装实战指南 本文提供了一份详尽的AnolisOS网卡驱动源码编译与安装实战指南。针对系统自带通用驱动不兼容导致网络无法使用的问题,文章从环境准备、源码获取、编译安装到新旧驱动替换与持久化配置,一步步解析了如何通过源码编译安装官方驱动,解决硬件兼容性问题,并确保驱动在系统重启后自动生效。 阅读详情

相关推荐

PPT高清导出秘籍:如何轻松设置600dpi图片分辨率

本文详细解析了PPT导出图片模糊的根本原因,并提供了通过修改Windows注册表将导出分辨率从默认的96dpi提升至600dpi的完整教程。该方法能显著提升图片清晰度,满足学术出版与高质量印刷需求,文中还包含效果对比、进阶设置及常见问题解答。

a0b1c2d3的专栏 1313

js高级03变量提升、闭包(2)

这里写目录标题6.条件判断下的变量提升 6.条件判断下的变量提升 在当前作用域下,不管条件是否成立都要进行变量提升 =>带var的还是只声明 =>带function的在老版本浏览器渲染机制下,声明+定义都处理。 但是为了迎合ES6中的块级作用域,新版浏览器对于函数(在条件判断中的函数),不管条件是否成立,都只是先声明,没有定义,类似于var。 console.log(a);//undefined if (1 === 2) { var a = 12; } console.log(

Int321的博客 863

7.3 空间矢量调制(SVM)整数算法

本文提出了一种基于整数运算的空间矢量调制(SVM)优化实现方案,适用于计算资源有限的Cortex-M0平台。针对传统SVM算法中复杂的三角函数和浮点运算问题,重点优化了扇区判断和占空比计算两个关键环节。在扇区判断方面,采用基于电压分量符号和相对大小的三变量法,避免了角度计算;在占空比计算方面,通过几何关系将作用时间表示为电压分量的线性组合,并采用定点数实现。方案还详细讨论了系数定点化、死区补偿等实现细节,在保证精度的同时显著降低了计算复杂度。实验结果表明,优化后的整数算法在M0平台上仅需50-80个周期即可

技术工作者 943

js闭包与状态管理

闭包在前端领域内算是老生常谈的一个话题了,基于我去解读zustand源码,我特定将闭包这个重新进行学习整理,已做到知其所以,知其所以然

weixin_37764929的博客 503

SAP UI5 应用开发教程的学习目录 - 循序渐进,由浅入深,适合不同水平的 SAP UI5 开发人员

笔者在业余时间设计了这份 SAP UI5 学习教程,把开发一个完整的 SAP UI5 应用的流程,拆分成若干个步骤,力求每个步骤里,把涉及到的知识点都涵盖到。建议零基础或者对 SAP UI5 知之甚少的 SAP UI5 初学者,按照顺序从第一个步骤开始循序渐进地学习,把这些代码下载到本地,配合教程的文字讲解,自己动手,以加深理解。 对于已经有一定基础的 SAPUI5 开发人员,可以通过本文的目录,跳过前面一部分比较基础的章节,直接挑选对自己工作项目有关,或者包含某些知识点自己尚未掌握的章节来有针对性地学习。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 3万+

ARM6818嵌入式视频播放器:硬解加速与Framebuffer渲染实战

嵌入式Linux音视频系统是智能座舱、工业HMI等场景的核心能力,其本质是软硬协同的实时多媒体处理系统。原理上需打通内核驱动(如VPU硬件编解码、FIMD多图层合成)、用户空间框架(GStreamer pipeline定制、SDL2硬件渲染)与应用层同步机制(PTS/HTS双时钟校准)。技术价值在于显著降低CPU负载(硬解可压至15%以下)、提升启动速度(<1.2s首帧)并保障音画同步精度(±3ms级)。典型应用场景包括车载信息娱乐、边缘AI终端及无X11的工控显示设备。本文基于ARM6818平台,深入VP

weixin_32456485的博客 77

重新理解JS变量提升和闭包

1. 变量提升 例子: console.log(a); //打印undefine var a = 3; 上面例子中的打印结果是undefine,并没有报错。我们通常写的var a=0; 这一句代码实际是包含了两个操作过程,首先是声明了一个变量a,然后是对a进行了赋值操作。JS中对于使用var声明的变量具有变量提升的作用,所以变量a的声明被提升到了当前作用域的最顶端。最终经过编译后的代码顺序实际是这样的: var a;//undefine console.log(a); a = 3; JS在ES6之前,只

qq_32077521的博客 552

【OpenClaw从入门到精通】第04篇:Web/TUI/钉钉全打通!OpenClaw多端交互实测指南(2026避坑版)

本文详解OpenClaw三大交互方式(Web控制台、TUI终端、钉钉集成),解决新手多端操作难题。Web控制台适合可视化深度配置,TUI终端满足服务器高效运维,钉钉集成实现移动办公协同。提供2026实测配置步骤、代码示例及避坑指南,涵盖设备配对、终端命令优化、聊天机器人回调验证等核心场景,助用户快速掌握"随时召唤AI助理"的全链路方案。 关键词 OpenClaw、多端交互、Web控制台、TUI终端、钉钉集成、AI助理、实操指南 核心亮点 全链路打通:覆盖Web/TIM/IM三端配置

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 3542

js变量提升理解,特别是闭包中的变量提升行为

先来看一个例子 var name = 'World!'; var t = {name:"w"}; (function () { //console.log(this); console.log(t); //console.log(name); if (typeof name === 'undefined') { var name = 'Jack'; console...

xinnian468153的博客 594

使用IGV软件可视化染色质可及性

染色质可及性(chromatin accessibility)是指DNA序列在植物细胞核中的可访问程度。染色质是由DNA和蛋白质组成的复杂结构,它紧密地包裹在细胞核中,并影响基因的表达和功能。染色质可及性研究着重于理解染色质是否容易被转录因子和其他调控蛋白访问,从而影响基因的表达。文献中,常常会有下面这种图片来表示基因组上的一些区域或基因的染色质开放性强弱。一般情况下,我们可以使用IGV软件或GSA-man软件进行可视化,两者的操作相似。这里,以IGV软件为例,演示如何对染色质可及性进行可视化。

沉香best的博客 3723

【系统分析师】高分论文:论软件需求验证方法及应用

本文以某清算平台建设项目为例,探讨了软件需求验证方法的应用。该项目旨在隔离银行与支付公司的直接通信,满足央行监管要求。作为系统分析师,作者通过需求测试和需求评审两种方法确保需求质量。需求测试采用概念测试用例提前发现问题;需求评审通过正式与非正式形式多方确认需求。项目结合邮件评审、专家会议等方式,最终形成完善的需求文档。平台上线后运行良好,验证了需求管理的重要性。该案例表明,科学的需求验证是项目成功的关键保障。

数据知道的博客 8123

JS高级中的作用域、变量提升、闭包与结构赋值

谈谈JS高级中的作用域、作用域链、闭包、变量提升、函数、结构赋值等内容学习,学习作用域、变量提升、闭包等语言特征,加深对 JavaScript 的理解,掌握变量赋值、函数声明的简洁语法,降低代码的冗余度。

weixin_74457498的博客 1268

YOLOv11改进策略【Neck】| BiFPN:双向特征金字塔网络-跨尺度连接和加权特征融合

可扩展的高效物体检测BiFPN(加权双向特征金字塔网络)

Limiiiing的博客 5494

web前端高级JavaScript - 关于变量提升this指向闭包作用域的一些练习题

变量提升作业 //1 console.log(a, b, c); // => undefined undefined undefined var a = 12, b = 13, c = 14; function fn(a) { console.log(a, b, c);// => 10 13 14 a = 100; c = 200; console.log(a, b, c);// => 100 13 200 } b = fn(10); c.

lixiaosenlin的专栏 6028

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【JavaScript】JS高级语法

变量与函数,作用域,定义变量,作用域链,闭包,预解析,let提升,函数参数,箭头函数,解构赋值,数组解构,对象解构,对象,字面量创建对象,构造函数,自定义构造函数,静态成员和实例成员,数据类型,引用类型,Object,Array,RegExp,包装类型,String,Number,Boolean,原型对象,原型链,this指向,普通函数,严格模式,箭头函数,改变函数的this指向,call,apply,bind,class关键字(类),封装,继承,浅拷贝,深拷贝

m0_64538862的博客 2807

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【JavaScript】JS高级-变量提升机制

《知识补充》 一、栈内存 1、代码执行的地方,也叫做执行环境栈ECStack; 2、存储变量、基本数据类型; 3、当栈内存被销毁后,存储的基本数据类型的值也随之销毁; 4、栈内存怎么销毁:包含全局执行上下文、函数执行上下文;也是利用null原理;关闭页面。 ==》全局执行上下文一般在页面关闭后销毁; 函数执行上下文一般在函数进栈执行完后就出栈销毁,如果被引用,则不出栈。 二、堆内存 1、存储引用数据类型; ==》堆内存释放销毁后,引用值也随之销毁; ==》堆内存释放:(谷歌的垃圾回收机制)当堆内存没有被任何

zhangankang的博客 632

JavaScript|JavaScript 高级语法——详细汇总

JavaScript|JavaScript 高级语法——详细汇总:变量提升和函数提升、构造函数和原型、对象、函数、严格模式、闭包、正则表达式

Syc1102g的博客 1661

深入解析JS变量作用域与闭包

JavaScript 中的变量声明方式 var、let 和 const 在作用域、提升、重复声明和暂时性死区等方面存在显著差异。理解这些差异对编写可维护且高效的代码至关重要。此外,作用域链和闭包是 JavaScript 的核心概念,闭包的形成原理、应用场景(如模块化、防抖节流)及其潜在的内存泄漏风险需要深入掌握。本文将通过详细解释和实例分析这些概念,并提供高级拓展内容

Myron的博客 1万+

JavaScript闭包与作用域:10个核心概念让你彻底掌握高级特性

JavaScript闭包和作用域是每个开发者都必须掌握的重要概念!🚀 理解这些概念不仅能让你写出更优雅的代码,还能避免常见的陷阱和错误。本文将带你深入探索JavaScript闭包和作用域的10个核心概念,从基础到高级,让你真正掌握这些强大的特性。 ## 什么是JavaScript闭包和作用域? 在JavaScript中,作用域决定了变量的可见范围,而闭包则是函数能够访问其定义时所处作用域中的

gitblog_00158的博客 844

详细解析 JavaScript 闭包

如何产生闭包? 当一个嵌套的内部(子)函数引用了嵌套的外部(父)函数的变量(函数)时, 就产生了闭包 产生闭包的条件? 函数嵌套 内部函数引用了外部函数的数据(变量/函数) 注意: 闭包存在于嵌套的内部函数中 常见的闭包 将函数作为另一个函数的返回值 将函数作为实参传递给另一个函数调用 闭包的作用 使用函数内部的变量在函数执行完后, 仍然存活在内存中(延长了局部变量的生命周期) 让函数外...

我是菜鸡 1594

【JS高级语法】JavaScript进阶Day01

JS作用域、JS垃圾回收机制、垃圾回收算法、闭包、变量提升、函数提升、动态参数、剩余参数、展开运算符、箭头函数、箭头函数参数、箭头函数this、数组结构、对象解构、forEach遍历数组、filter筛选数组

学习是最低成本的投资 1173

Javascript的高级函数之闭包

目录闭包的理解如何产生闭包?闭包是什么?产生闭包的条件常见的闭包将函数作为另一个函数的返回值将函数作为一个实参传递给另一个函数调用闭包的作用闭包生命周期闭包的应用:定义JS模块自定义模块闭包的缺点及解决方法缺点内存溢出和泄漏解决方法面试题 闭包的理解 如何产生闭包? 当一个嵌套的内部(子)函数引用了嵌套的外部(父)函数的变量(函数)时,就产生了闭包。 闭包是什么? 理解一:闭包是嵌套的内部函数,例如:下面例子中内部函数fun2()就是一个闭包 function fun1(){ var

1900's 88 keys的博客 1040

JavaScript变量

JavaScript变量是编程的基础构建块,它们的灵活性和动态类型特性使得JavaScript成为一种强大的编程语言。然而,这也增加了编码时的复杂性,需要开发者更加谨慎地处理变量和它们的作用域、类型以及比较操作。通过理解变量的这些基本特性,我们可以写出更加健壮和可维护的代码。同时,利用解构赋值和闭包等高级特性,我们可以写出更加优雅和高效的代码。👨‍💻博主Python老吕评论,您的举手之劳将对我提供了无限的写作动力!《Python全栈工程师》《跟老吕学MySQL》《Python游戏开发实战讲解》🌞。

Python老吕的博客 1114

Js高级总结2 JavaScript函数高级

一个代码段所在的区域分类 全局作用域 函数作用域 块级作用域(ES6才有)作用 隔离变量 不同作用域下同名变量不会冲突。

weixin_54372875的博客 1011

JavaScript执行机制:变量提升、作用域链、词法作用域、块级作用域、闭包和this

本文详细介绍了JavaScript中的关键概念,包括作用域链、词法作用域、块级作用域、闭包和this。文章通过实例阐述了这些概念在JavaScript代码中的应用,以及它们在保证变量正确访问、提高代码可读性和可维护性方面的重要性。深入了解这些核心概念有助于编写高效、可维护的JavaScript代码,并充分利用JavaScript的强大表达能力。

陆业聪 1479

js闭包循环原因_javascript与闭包

定义闭包就是能够读取其他函数内部变量的函数。在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。作用一、 存储变量闭包可以保存外部函数的变量,内部函数保留了对外部函数的活动变量的引用,所以变量不会被释放。可以用在把一些不经常变动计算起来又比较复杂的值保存起来,节省每次的访问时间。示例:f...

weixin_39804329的博客 245

深入浅出搞懂JavaScript中的变量提升和函数声明提升

什么是变量提升?变量提升是当栈内存作用域形成时,JS代码执行前,浏览器会将带有var, function关键字的变量提前进行声明 declare (值默认就是 undefined),定义 defined (就是赋值操作),这种预先处理的机制就叫做变量提升机制也叫预定义。 在变量提升阶段:带 var 的只声明还没有被定义,带 function 的已经声明和定义。所以在代码执行前有带 var 的就提前声明。

smallteddy.blog.youkuaiyun.com 2396
上一篇: js基础知识07(未完)
下一篇: js高级03变量提升、闭包(2)
fdt丶
博客等级 码龄9年 68粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值