目录闭包和作用域变量声明变量和函数的声明提升作用域和作用域链执行上下文闭包垃圾回收机制闭包和作用域变量声明var声明特点在使用var声明变量时,变量会被自动添加到最接近的上下文var存在声明提升。var声明会被拿到函数或全局作用域的顶部,位于作用域中所有代码之前。可多次重复声明。而重复的var声明则会被忽略let声明特点let声明存在块级作用域let声明(创建过程)存在提升。但由于暂时性死区(temporaldeadzone),无法在let声明之前去使用变量在同一作用域内无法重复声明。重复的let声明会抛出SyntaxError错误const声明特点const声明存在块级作用域const一旦声
闭包函数什么是闭包函数如果内函数使用了外函数的局部变量,并且外函数把内函数返回出来的过程叫做闭包,里面的内函数是闭包函数。#外函数outerdefouter(): #外函数变量num var='外函数局部变量' #内函数inner definner(): #内函数使用了外函数的变量num print('内函数使用了:'+var) #外函数将使用了外函数的局部变量的内函数返回 returninner#返回出的结果就是内函数inner,现在inner就是一个闭包函数func=outer()#执行返回出的inner函数func()#内函数使用了:外函数局部变量下面是一个复杂的版本。inner函数
闭包函数什么是闭包函数如果内函数使用了外函数的局部变量,并且外函数把内函数返回出来的过程叫做闭包,里面的内函数是闭包函数。#外函数outerdefouter(): #外函数变量num var='外函数局部变量' #内函数inner definner(): #内函数使用了外函数的变量num print('内函数使用了:'+var) #外函数将使用了外函数的局部变量的内函数返回 returninner#返回出的结果就是内函数inner,现在inner就是一个闭包函数func=outer()#执行返回出的inner函数func()#内函数使用了:外函数局部变量下面是一个复杂的版本。inner函数
01、如何判断⼀个变量是不是数组?letarr=[1,2,3,4]functionfun(){returnarrinstanceofArray}02、如何使⽤class实现继承?classfu{consructor(name,age)}classsonextendsfu{super(...arguments))}扩展://父类classPeople{constructor(name,age){this.name=name;this.age=age;}eat(){console.log("吃吃吃");}}//子类classStudentextendsPeople{constructor(name
01、如何判断⼀个变量是不是数组?letarr=[1,2,3,4]functionfun(){returnarrinstanceofArray}02、如何使⽤class实现继承?classfu{consructor(name,age)}classsonextendsfu{super(...arguments))}扩展://父类classPeople{constructor(name,age){this.name=name;this.age=age;}eat(){console.log("吃吃吃");}}//子类classStudentextendsPeople{constructor(name
首先要知道JavaScript是使用垃圾回收的语言,它会每隔一段时间就会释放内存进行闲置资源回收。像函数中的局部变量,函数执行时在内部使用了变量,栈内存会分配空间以保存相应的值。在函数使用结束后,这个局部变量就不需要了,占用的内存就会被释放。那我们若是想要使这个变量不被清理,一直处于被使用中,那就得让他一直被引用,那么我们可以在一个函数里面嵌入一个函数,小函数里面引用大函数里的变量,并把这个函数返回到全局中,此刻我们便可让它不被清理并在全局中使用它了放代码:1functionbig(){//大函数2varsavevar=10;//数据3functionlittle(){//小函数4retu
首先要知道JavaScript是使用垃圾回收的语言,它会每隔一段时间就会释放内存进行闲置资源回收。像函数中的局部变量,函数执行时在内部使用了变量,栈内存会分配空间以保存相应的值。在函数使用结束后,这个局部变量就不需要了,占用的内存就会被释放。那我们若是想要使这个变量不被清理,一直处于被使用中,那就得让他一直被引用,那么我们可以在一个函数里面嵌入一个函数,小函数里面引用大函数里的变量,并把这个函数返回到全局中,此刻我们便可让它不被清理并在全局中使用它了放代码:1functionbig(){//大函数2varsavevar=10;//数据3functionlittle(){//小函数4retu
前言本文承接上篇夯实基础上篇-图解JavaScript执行机制,请先阅读上篇~讲基础不容易,本文通过7个demo和6张图,和大家一起学习温故作用域链和闭包,本文大纲:什么是作用域链什么是词法作用域什么是闭包闭包的实际使用案例什么是作用域链正文开始~请思考下面demo的name打印什么functiontest(){console.log(name)}functiontest1(){constname='test1的name'test()}constname='global的name'test1()通过执行上下文来分析代码的执行流程,执行到test函数时:那test函数里的name是哪个呢?这就涉
前言本文承接上篇夯实基础上篇-图解JavaScript执行机制,请先阅读上篇~讲基础不容易,本文通过7个demo和6张图,和大家一起学习温故作用域链和闭包,本文大纲:什么是作用域链什么是词法作用域什么是闭包闭包的实际使用案例什么是作用域链正文开始~请思考下面demo的name打印什么functiontest(){console.log(name)}functiontest1(){constname='test1的name'test()}constname='global的name'test1()通过执行上下文来分析代码的执行流程,执行到test函数时:那test函数里的name是哪个呢?这就涉
加var变量和不加var变量的区别加var的变量都会提升,不管代码执行与否,不加var的变量预编译阶段不会提升原型链和作用域链window.a//不会报错返回undefined访问对象不存在的属性不会报错,走原型链访问GO中不存在的属性a//直接访问未定义的变量会报错,走作用域链没有找到不管是否加var只要是全局变量,在非严格模式下都会挂载到GO上没有加var的只能做全局项目中尽量避免var,更不要不声明let声明的变量不能访问let+{}可以形成块级作用域只能在块中使用使用let声明的变量不会挂载到GO上let定义同一个变量只能定义一次,二次定义会报错function(a){//在函数内部的