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

一道面试题解析新旧版本浏览器下的变量提升 safari浏览器和ie10及以下的浏览器一样都是低版本的浏览器。 现在最新版本的浏览器要前后都兼容: ->向前兼容ES3/5规范 1.判断体和函数体等不存在块级上下文,上下文只有全局和私有 2.不论条件是否成立,带function的都要声明+定义 -> 向后兼容ES6规范 1.存在块级作用域,大括号中出现let/const/function……都会被认为是块级作用域 2.不论条件是... 阅读详情


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

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

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

6.条件判断下的变量提升

在当前作用域下,不管条件是否成立都要进行变量提升

=>带var的还是只声明
=>带function的在老版本浏览器渲染机制下,声明+定义都处理。
但是为了迎合ES6中的块级作用域,新版浏览器对于函数(在条件判断中的函数),不管条件是否成立,都只是先声明,没有定义,类似于var。

 console.log(a);//undefined
 if (1 === 2) {  不成立,则不执行
     var a = 12;
 }
 console.log(a);//undefined

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-条件判断下的变量提升到底有多坑(???)

函数本身:当条件成立,进入到判断体中(在ES6中它是一个块级作用域)

console.log(fn);  //undefined

if (1 === 1) {
    console.log(fn); ?//ƒ fn() {console.log('hello');}?
函数本身:当条件成立,进入到判断体中(在ES6中它是一个块级作用域)
第一件事并不是代码执行,而是类似于变量提升一样,先把fn声明和定义
了,也就是判断体中代码执行之前,fn就已经赋值了


    function fn() {
        console.log('hello');
    }
}
console.log(fn);//ƒ fn() {console.log('hello');}

7.重名问题的处理

//1.带var和function关键字声明相同的名字,这种也算是重名了(其实是一个fn,只是存储值的类型不一样)
//2.关于重名的处理:如果名字重复了,不会重新的声明,但是会重新的定义(重新赋值)

var fn = 11;
function fn() {
    console.log(22);

}
console.log(fn);//11
fn();//Uncaught TypeError: fn is not a function

????我也很懵????

  fn(); //undefined
  function fn() { console.log(1); }
  fn();  //4
  function fn() { console.log(2); }
  fn();  //4
  var fn = 100;
  fn();  //fn is not a function
  function fn() { console.log(3); }
  fn();  //fn is not a function
  function fn() { console.log(4); }
  fn();  //fn is not a function

3.ES6中let不存在变量提升

3.1不允许重复定义

3.2不存在变量提升

1.在ES6中基于let/const等方式创建变量或者函数,不存
在变量提升机制,(存在作用域链)

2.切断了全局变量和w工NDOW属性的映射机制

=>在相同的作用域中,基于LET不能声明相同名字的变量(不管用什么方式在当前作用域下声明了变量,再次使用LET创建都会报错)

虽然没有变量提升机制,但是在当前作用域代码自上而下执行之前,浏览器会做一个重复性检测(语法检测):自上而下查找当前作用域下所有变量,一旦发现有重复的,直接抛出异常,代码也不会在执行了(虽然没有把变量提前声明定义,但是浏览器已经记住了,当前作用域下有哪些变量)

console.log(a); // Uncaught ReferenceError: Cannot access 'a' before initialization

let a = 12;
console.log(window.a);//undefined
let a = 12, b = 10;
let fn = function () {
    //console.log(a, b);//Uncaught ReferenceError: Cannot access 'a' before initialization
    let a = b = 20;  //let a=20;  把全局中的b=20
    console.log(a, b);//20  20
}
fn();
console.log(a, b);//10 20

3.3暂时性死区(??)

// var a = 12;
// if (true) {
//     console.log(a);//=>Uncaught ReferenceError: a is not defined
//     let a = 13;//=>基于LET创建变量,会把大部分{}当做一个私有的块级作用域(类似于函数的私有作用域),在这里也是重新检测语法规范,看一下是否是基于新语法创建的变量,如果是按照新语法规范来解析
// }



// console.log(a);//=>Uncaught ReferenceError: a is not defined
console.log(typeof a);//=>"undefined" 在原有浏览器渲染机制下,基于typeof等逻辑运算符检测一个未被声明过的变量,不会报错,返回UNDEFINED


// console.log(a);//=>Uncaught ReferenceError: a is not defined
console.log(typeof a);//=>Uncaught ReferenceError: a is not defined
let a;//=>如果当前变量是基于ES6语法处理,在没有声明这个变量的时候,使用TYPEOF检测会直接报错,不会是UNDEFINED,解决了原有的JS的死区

-------------------------------------------------------------------------------------------------------------------------------------------------------------

·闭包作用域(scope)
1.作用域处理机制
+全局变量和私有变量
+作用域链机制
+闭包的作用:保存&保护

2.闭包作用域练习
+JQ源码分析
+选项卡剖析
+面试题练习

3.ES6中的块级作用域
+let可以形成块级作用域
+实际意义
+const

闭包、作用域(scope)

1.作用域处理机制

闭包:形成私有作用域保护变量不受外界的干扰,这种保护机制可以理解为闭包。私有作用域下的数据和全局的无关

作用域:函数执行会形成一个私有作用域,给代码执行提供一个环境

1.1全局变量和私有变量

在全局作用域下声明的变量是全局变量,
在私有作用域下声明的变量是私有变量。

var a = 123;
if (true) {
    a = 321;// Cannot access 'a' before initialization
    let a = 888;
}

var a = 12, b = 13, c = 14;
function fn(a) {
    console.log(a, b, c);//12  undefined  14(C是全局的)
    var b = c = a = 20;
    /*var b=20;   c=20;把全局的c修改为20   a=20;*/

    console.log(a, b, c); // 20  20  20 
}
fn(a);
/*把FN执行(小括号中是实参:值)
执行FN把全局变量A的值12当做实参传递给函数的形参
fn (12)
*/
console.log(a, b, c);//12  13  20

-------------------------------------------------------------------------------------------------------------------
8-关于私有变量的一点练习

var ary = [12, 23];
function fn(ary) {
    console.log(ary);   //[12, 23]
    ary[0] = 100;
    ary = [100];
    ary[0] = 0;
    console.log(ary);    //[0]
}
fn(ary);
console.log(ary);  //[100,23]

在这里插入图片描述

1.2作用域链机制

上级作用域的查找

 var a = 12;
 function fn() {
     console.log(a);
 }
 fn();//12
 var a = 12;
 function fn() {
     console.log(a);
 }
 function sum() {
     var a = 120;
     fn();   fn函数是在全局下创建的,他要向上查找到  a = 12;
 }
 sum();//12

当前函数执行,形成一个私有作用域A,A的上级作用域是谁,和他在哪执行的没有关系。
和他在哪创建(定义)的有关系,在哪创建的,它的上级作用域就是谁。

var a = 12;
function fn() {
     
    // arguments:实参集合
    
    // 了解 arguments.callee:函数本身fn
    // 了解 arquments.callee.caller:当前函数在哪执行的,CALLER就是谁(记录的是它?执行的宿主环境),在全局下执行caller的结果是null
    console.log(arguments.callee.caller);
}
function sum() {
    var a = 120;
    fn();
}
sum();// sum() { var a = 120;  fn();     }

function aa(){  
    fn();
}
aa();//ƒ aa(){ fn(); }
 var n = 10;
 function fn() {
     var n = 20;
     function f() {
         n++;
         console.log(n);
     }
     f();
     return f;
 }

 var x = fn();  //21
 x();//22
 x();//23
 console.log(n);//10

在这里插入图片描述

堆栈内存

JS中的内存分为堆内存和栈内存

  • 堆内存:存储引用数据类型值(对象:键值对 函数:代码字符串)
  • 栈内存:提供JS代码执行的环境和存储基本类型值

-----------------------------------------------------------------------------------------

[堆内存释放]

  • 让所有引用堆内存空间地址的变量赋值为null即可(没有变量占用这个堆内存了,浏览器会在空闲的时候把它释放掉)

[栈内存释放]

  • 一般情况下,当函数执行完成,所形成的私有作用域(栈内存)都会自动释放掉(在栈内存中存储的值也都会释放掉),但是也有特殊不销毁的情况:
  • 1.函数执行完成,当前形成的栈内存中,某些内容被栈内存以外的变量占用了,此时栈内存不能释放(一旦释放外面找不到原有的内容了)
  • 2.全局栈内存只有在页面关闭的时候才会被释放掉
  • …
  • 如果当前栈内存没有被释放,那么之前在栈内存中存储的基本值也不会被释放,能够一直保存下来

???


        var i = 1;
        function fn(i) {
            return function (n) {
                console.log(n + (++i));
            }
        }
        var f = fn(2); 
        f(3);       6
        fn(5)(6);   12
        fn(7)(8);   16
        f(4);       8

1.3闭包的作用:保存&保护

[闭包]

  • =>函数执形成一个私有的作用域,保护里面的私有变量不受外界的干扰,这种保护机制称之为“闭包”

  • =>市面上的开发者认为的闭包是:形成一个不销毁的私有作用域(私有栈内存)才是闭包

柯里化函数
    function fn() {
        return function () {
        }
    }
    var f = fn();

惰性函数
    var utils = (function () {
        return {
        }
    })();

/闭包项目实战应用
真实项目中为了保证Js的性能(堆栈内存的性能优化),应该尽可能的减少闭包的使用(不销毁的堆栈内存是耗性能的)

1.闭包具有”保护”作用:保护私有变量不受外界的干扰
2.闭包具有"保存”作用:形成不销毁的栈内存,把一些值保存下来,方便后面的调取使用

计算机组成原理课设 计算机组成原理课程设计 阅读详情

相关推荐

潜行游戏设计:核心机制与关卡设计解析

潜行游戏作为动作游戏的重要分支,通过视觉遮蔽、声音传播和AI行为树等复杂系统,为玩家提供独特的策略体验。视觉隐蔽系统采用视野锥和光照值的双重判定,声学传播模型模拟距离衰减和材质穿透,而敌人AI行为树则包含巡逻、警戒和团队协作等状态节点。这些技术不仅提升了游戏的真实感和挑战性,还在《合金装备》《刺客信条》等经典作品中得到广泛应用。潜行游戏的关卡设计强调多路径拓扑结构和环境叙事元素,通过沙漏模型和动态难度调节,平衡自由度和开发成本。未来,基于ML的适应性AI和物理模拟的隐蔽系统将成为创新方向。

weixin_42497762的博客 179

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

NX/UG二次开发—CAM—设置程序修剪边界Boundary

最近做了一个设置CAM程序边界的小工具,分享一下经验(官方的代码在文章末尾处),以下均以修剪边界曲线为例。 以下为官方提供的源码: /***************************** Include Files **********************************/ #include <stdlib.h> #include <uf.h> #include <uf_obj.h> #include <uf_object_type

门前大桥下,游过一群鸭,快来看一看,原来是C++ 3733

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

变量提升机制 1.数据值操作机制 2.变量提升机制 +什么是变量提升 +带var和不带的区别 +等号左边变量提升 +条件判断下的变量提升 +重名问题的处理 3.ES6中let不存在变量提升 +不允许重复定义 +暂时性死区 +不存在变量提升 ...

Int321的博客 282

SV fork join_none & for循环结合使用

fork join_none与循环联用常见问题解决方案

ZhangShuHuai11的博客 880

【微信小程序开发与设计】垃圾智能分类小程序

垃圾分类是将来生活可持续发展的必需项。但是很多人由于缺乏垃圾分类知识,或是因为垃圾分类困难,费时费力,所以没有好好贯彻垃圾分类政策,此时设计一款方便于群众进行智能化垃圾识别分类的微信小程序就显得尤为必要。

Markelle_Fultz的博客 8246

循环中使用闭包解决 var 定义函数的问题

//本文首发于掘金社区,链接:https://juejin.im/post/5d7461c6e51d453bc470df4f 经典面试题,循环中使用闭包解决 var 定义函数的问题 for ( var i=1; i<=5; i++) { setTimeout( function timer() { console.log( i ); }, i*1000 ); } 复制代码 ...

AC总有一天的博客 1008

Claude Code 从入门到精通,通过实战项目穿插 Agent Skills、MCP、Hooks、子代理、插件等十五个知识点

本文介绍了Claude Code的高级使用技巧,通过一个个人简历网站实战项目,详细讲解了15个核心知识点。主要内容包括:三种权限模式(默认/编辑/计划)的使用与切换;历史会话管理(/resume、/rename、/clear命令);会话回滚功能(/rewind);以及危险参数--dangerously-skip-permissions的注意事项。文章还演示了如何通过计划模式拆分代码文件,并强调了在复杂任务中仔细检查规划步骤的重要性。这些技巧能帮助开发者更高效地使用Claude Code完成项目开发。

1788

详解变量提升和闭包的应用

文章目录堆栈内存变量提升带var和不带var的区别作用域链的拓展闭包什么是闭包闭包的应用 堆栈内存 栈内存:作用域 提供一个供js代码自上而下执行的环境(代码都是在栈内存中执行) 存储基本数据类型值 释放:当栈内存被销毁,存储的那些基本值也跟着被销毁了(一般函数执行完成所形成的私有作用域会自动释放,除非某些内容被栈内存以外的变量占用了此时栈内存不能释放)全局栈内存只有在页面关闭的时候被释放 堆内存:引用值对应的空间 存储引用类型值(对象:键值对 函数:代码字符串) 当前堆内存释放销毁,那么这个引用值彻底没了

qq_33712668的博客 580

以太网PHY寄存器

并且,值得注意的是,由于目前很多百兆的PHY芯片其MAC接口主流的都是SMII/S3MII,8个端口的接口是相互关联的,一个端口设置Isolate可能会影响其他端口的正常使用,因此在使用中注意不要随意更改bit10的状态。Bit10和bit11的区别是,bit11的配置在强制情况下生效,PHY只能工做与bit11指定的工作模式,而bit10的配置在非强制配置情况下生效,仅仅控制PHY在AN时候的优先级,偏向于Maser或者Slave,但是最终的工作模式看协商的结果,不一定和优先级配置的结果一致。

mangofu的博客 292

超详细的Burp Suite安装使用

‌Burp Suite是一个强大的Web应用安全测试工具,适用于网络安全专业人士进行自动化网络应用程序的安全测试。‌ 它提供了在Windows和Kali Linux上安装和激活Burp Suite Professional的简便步骤,帮助用户快速集成并启用强大的网络扫描和渗透测试功能。Burp Suite的特点包括易于安装、良好的兼容性、内置的自动化工具、优秀的用户体验以及详细的教程,使得无论是安全领域的新手还是经验丰富的专家,都能轻松上手并高效地进行安全测试。此外,Burp Suite还支持扩展功能的使用

Dreams°的博客 2641

03-js提升与闭包练习题

js变量、函数提升和闭包相关练习题 案例01 1.代码 <script> var a = 1; var obj = { name:"wangcai" }; function f() { var a2 = a; obj2 = obj; a2 = a; obj.name = "xiaoqiang"; } f(); console.log(a); console.log(obj);

weixin_45344023的博客 820

GEE土地分类:一文读懂精度评定—混淆矩阵confusion matrix、整体精度OA、用户者精度、生产者精度、kappa系数和F1score系数含案例

本文介绍了如何在 Google Earth Engine (GEE) 中构建和分析混淆矩阵,以评估分类模型的性能。首先,通过 ee.Array 构建混淆矩阵,并展示了如何指定自定义类标签。接着,计算了多种性能指标,包括准确率、Kappa 值、F1-score、消费者准确率和生产者准确率。此外,还演示了如何计算不同类别的 F1-score。最后,通过一个实际案例,展示了如何利用 GEE 进行土地分类,并评估分类器的性能,包括训练和验证样本的准确率、Kappa 值等指标。这些步骤帮助用户理解模型的优缺点,并进行

此星光明博客 442

【JavaScript】闭包以及原理解析

闭包是JavaScript中一个非常容易让人迷惑的知识点一个函数和对其周围状态(,词法环境)的引用捆绑在一起(或者说函数被引用包围),这样的组合就是闭包(closure);也就是说,闭包让你可以在一个内层函数中访问到其外层函数的作用域;在JavaScript中,每当创建一个函数,闭包就会在函数创建的同时被创建出来;

m0_68324632的博客 2100

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

深入浅出JS—03 函数闭包和内存泄漏

JavaScript中的函数,如果它访问了外层作用域中的自由变量,那么该函数和外层自由变量共同构成了闭包

分享前端知识,记录前端进阶 802

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

JS高级03

笔记目录小概1. 闭包1.1 什么是闭包1.2 闭包的作用1.3 使用闭包的注意点1.4 沙箱/沙盒2. 递归!2.2 递归案例 小概 本章的学习内容:闭包,递归,自执行函数 1. 闭包 1.1 什么是闭包 1.声明在函数内部,能够访问函数内部的局部变量的这么一个函数 2.闭包是函数内部和函数外部的一个连接桥梁 3.闭包是一个不会被销毁的封闭的环境 function test1(){ let num = 10; //局部变量的生命周期,函数执行完就回收

tooHar的博客 254

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

JavaScript第五天(函数,this,严格模式,高阶函数,闭包,递归,正则,ES6)高级

JavaScript第五天(函数,this,严格模式,高阶函数,闭包,递归,正则,ES6)高级

ingenuou_的博客 2200

浅谈javascript之闭包

目录闭包变量的概念自由变量闭包的作用1:闭包的作用2:封装函数 给搜索框添加一个属性,实现这个表单输入的时候,不会弹出记录框! -启用自动完成功能的表单(其中一个输入字段禁用了自动完成) 这边会使用到节流和去抖的知识:有兴趣的可以看这一篇文章 链接: link. 闭包 01:函数调用 => 产生一个新的执行环境 02:变量对象 => 用来存储代码执行之中的数据(就是变量对象) 注意点;window对象是一个持续存在的对象,负责存储全局环境下得所有变量和对象! 03:活动对象 => 变量对

weixin_47409897的博客 236

JS基础知识03-函数(数组、变量提升等)

本文详细阐述了JavaScript基础知识中的函数,数据,其中还有变量提升,二维数组等相关内容的拓展

m0_64455070的博客 759

视频教程-通俗易懂的JavaScript高级教程(含资料)-JavaScript

通俗易懂的JavaScript高级教程(含资料) 张长志技术全才、擅长领域:...

weixin_34154691的博客 6216

03-JavaScript高级-函数知识点总结

学习目标: 理解面向对象开发思想 掌握 JavaScript 面向对象开发相关模式 掌握在 JavaScript 中使用正则表达式 typora-copy-images-to media JavaScript 高级 课程介绍 课程大纲 在线地址:JavaScript 高级 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XyZZSVCX-1575291392...

qq_45052568的博客 502

03js进阶

函数作用域块作用域:var 不会产生块作用域,不推荐使用。

WZDBXHNL的博客 991

JS高级部分知识点简单总结

2020.12.9 17:38 JS高级01.this指向02.call、apply、bind修改this指向03.原型和原型链04.get和set05.属性特征06.变量提升07.作用域和作用域链08.浅/深拷贝09.高阶函数10.闭包 01.this指向 事件函数中:指向事件源 普通函数中:指向的是window对象 构造函数中:指向的是实例对象 普通对象中:指向的是当前对象 02.call、apply、bind修改this指向 var stu={ name:'zs', age:12, wei

qac的博客 310

js进阶--let,上级作用域,闭包03

文章目录es6中的let小练习上级作用域小练习堆栈内存的释放问题堆内存的释放 `背`常见的浏览器释放主要有两种:栈内存的释放 `背`闭包闭包的作用引伸--工作中闭包的应用(不用记)练习,闭包实现选项卡 es6中的let es6没有变量提升,但是在代码执行之前会有一个词法检测,来看你的代码是不是会有语法错误,如果有直接报错 //直接打印报错,不执行console //Identifier 'a' has already been declared console.log(1); let a=1;

cuishoulong3424的博客 246

【03_03_JS高级】01_JS作用域

主要内容:作用域【var/let/const区别】、闭包、预解析、箭头函数。

Delphine_zj的博客 98

【JavaScript-Day 21】闭包实战:从模块化到内存管理,高级技巧全解析

本文深入探讨JavaScript闭包的进阶应用与内存管理。作为【JavaScript-Day 20】的续篇,文章首先回顾闭包的基本原理,重点分析闭包在模块化、信息隐藏等场景中的实际应用。通过代码示例展示如何利用IIFE实现模块化封装私有变量,同时详细讲解闭包可能导致的内存泄漏问题及其解决方案。文章还涵盖闭包在事件处理、函数柯里化等高级技巧中的应用,并给出性能优化的实用建议,帮助开发者安全高效地使用这一核心特性。 (字数:148)

吴师兄大模型的博客 978
上一篇: js高级02变量提升、闭包(1)
下一篇: 报错Component name “xxx“ should always be multi-word vue/multi-word-component-names
fdt丶
博客等级 码龄9年 68粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值