首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

理解js变量提升

深刻理解变量提升 当执行 JS 代码时,会生成执行环境,只要代码不是写在函数中,就是在全局执行环境中,函数中代码会产生函数执行环境,只此两种执行环境。...通常提升解释是说将声明代码移动到了顶部,这其实没有什么错误,便于大家理解。但是更准确解释应该是:在生成执行环境时,会有两个阶段。...第一个阶段是创建阶段,JS 解释器会找出需要提升变量和函数,并且给他们提前在内存中开辟好空间,函数的话会将整个函数存入内存中,变量只声明并且赋值为 undefined,所以在第二个阶段,也就是代码执行阶段...在提升过程中,相同函数会覆盖上一个函数,并且函数优先于变量提升 b() // call b second function b() { console.log('call b fist')...let 不能在声明前使用,但是这并不是常说 let 不会提升,let 提升了,在第一阶段内存也已经为他开辟好了空间,但是因为这个声明特性导致了并不能在声明前使用。

5.5K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    js变量提升 和函数提升

    两个最简单例子理解变量声明提升和函数声明提升 一、变量提升 变量提升即将变量声明提升到它所在作用域最开始部分 例1: function fn () { var a ="hello...但是我需要说明是,变量提升 只是提升变量声明,并不会把赋值也提升上来 二、函数提升 js中创建函数有两种方式:一种是函数表达式,另外一种是函数声明方式。只有函数声明才存在函数提升!...() {} 总结和注意点 1、变量提升 1、通常JS引擎会在正式执行之前先进行一次预编译,在这个过程中,首先将变量声明及函数声明提升至当前作用域顶端,然后进行接下来处理 2、如果当前作用域中存在此变量声明...2、函数声明优先级最高,会被提升至当前作用域最顶端,所以第一次调用时实际执行了下面定义函数声明,然后第二次调用时,由于前面的函数表达式与之前函数声明同名,故将其覆盖,以后调用也将会打印同样结果...3、函数优先权是最高,它永远被提升至作用域最顶部,然后才是函数表达式和变量按顺序执行

    1.4K41

    js变量提升与函数提升详细过程

    这就涉及到js变量提升和函数提升具体过程了。 1、变量提升 js是怎么创建变量呢?...如下面的代码: var a = 1; var b = 2; js在解析上面的代码时候,其实会按照下面的方式进行解析: var a; var b; a = 1; b = 2; 所以 js 并不是在我们定义一个变量时候...变量在声明提升时候,是全部提升到作用域最前面,一个接着一个。但是在变量赋值时候就不是一个接着一个赋值了,而是赋值位置在变量原本定义位置。...原本js定义变量地方,在js运行到这里时候,才会进行赋值操作,而没有运行到变量,不会进行赋值操作。 所以变量提升提升其实是变量声明,而不是变量赋值。...(a); // 1 console.log(a); // 1 } foo(); 所以从上面的栗子可以看到,变量提升是在函数提升之前,但是变量赋值部分是在js原型到变量定义位置才给变量赋值

    1.5K30

    JS入门难点解析2-JS变量提升和函数提升

    很多同学看到这一段,就想当然认为JS就是一行行往下执行语言,只要对着源码往下一路走即可。...难道JS不是一行行顺序执行吗?...而本篇文章所要讨论内容——JS变量提升和函数提升就发生在编译阶段。(随着自己进一步了解执行上下文,觉得这里所指编译器作用有点类似于执行上下文生命周期第一阶段)。 2....变量声明与函数声明 2.1 变量声明和函数声明定义 首先我们来看一下,何谓变量声明与函数声明。 变量声明就是 var XXX;。...这里报是未定义错误,而前面报是类型错误。也就是说明,其实sayHello被定义了,但它不是一个函数。

    1.3K30

    JS if 中函数声明提升

    可以看到, 给a赋值5, 并没有赋值到全局变量a上 解决 先看看MDN里说明 ? 从ES6开始 在严格模式下,块里函数作用域为这个块。ES6之前不建议块级函数在严格模式下使用....在ES6非严格模式下, 块中函数声明会出现提升, 所以最好使用函数表达式来定义函数 ---- 走走流程看看到底发生了啥 我们可以先把, function a () {}注释掉, 可以看到报错了, Uncaught...ReferenceError: a is not defined, 所以if里函数声明确实存在变量提升 ?...然后, 我们可以打点调试一下 在if 中a=1语句之前, 我们可以看到函数声明已经提升了, 此时if作用域里a为函数 ? 而全局a还是undefined ?...在运行到 function a () {} 后, 我们可以看到, 块级作用域a值会赋值给全局作用域a ?

    3.7K20

    JS学习系列 04 - 提升

    但是,这里结果是 undefined 。 之前讨论编译器时候,我们知道 JS 引擎会在解释代码之前首先对其进行编译。编译阶段第一部分工作就是找到所有的声明,并用合适作用域将它们关联起来。...第一个定义声明是在编译阶段进行。第二个赋值声明会被留在原地等待执行阶段。...这个过程就叫作“提升”。 注意,只有声明本身会被提升,而赋值操作和其他运行逻辑都会停留在原地,想象一下,如果提升会改变代码执行顺序,那么会造成非常严重破坏。...函数优先 函数声明和变量声明都会被提升。但是一个值得注意细节是,函数声明会首先被提升,然后才是变量。...console.log(2); }; foo(); // 2 function foo () { cosole.log(3); } 复制代码 这个例子充分说明了在同一个作用域中进行重复定义是非常糟糕

    39530

    JS学习系列 04 - 提升

    但是,这里结果是 undefined 。 之前讨论编译器时候,我们知道 JS 引擎会在解释代码之前首先对其进行编译。编译阶段第一部分工作就是找到所有的声明,并用合适作用域将它们关联起来。...第一个定义声明是在编译阶段进行。第二个赋值声明会被留在原地等待执行阶段。...这个过程就叫作“提升”。 注意,只有声明本身会被提升,而赋值操作和其他运行逻辑都会停留在原地,想象一下,如果提升会改变代码执行顺序,那么会造成非常严重破坏。...函数优先 函数声明和变量声明都会被提升。但是一个值得注意细节是,函数声明会首先被提升,然后才是变量。...console.log(2); }; foo(); // 2 function foo () { cosole.log(3); } 这个例子充分说明了在同一个作用域中进行重复定义是非常糟糕

    10310

    JS提升幸福度小技巧

    toString和 valueOf方法来自定义对象类型转换: 2 * { valueOf: ()=>'3' } // 6 'J' + { toString: ()=>...'S' } // "JS" 《Effective JavaScript》P11:当 +用在连接字符串时,当一个对象既有 toString方法又有 valueOf方法时候,JS...我们知道JS中有一些假值:false, null, 0, "", undefined, NaN,怎样把数组中假值快速过滤呢,可以使用Boolean构造函数来进行一次转换 const compact...2.2 强制参数 默认情况下,如果不向函数参数传值,那么JS 会将函数参数设置为 undefined。其它一些语言则会发出警告或错误。...要执行参数分配,可以使用 if语句抛出未定义错误,或者可以利用 强制参数。 mandatory = ( ) => { throw new Error('Missing parameter!')

    82720

    js匿名函数_js匿名函数怎么定义

    大家好,又见面了,我是你们朋友全栈君。 定义:匿名函数顾名思义指的是没有名字函数,在实际开发中使用频率非常高!也是学好JS重点。 匿名函数:没有实际名字函数。...首先我们声明一个普通函数: //声明一个普通函数,函数名字叫fn function fn(){ console.log(“张培跃”); } 然后将函数名字去掉即是匿名函数: //匿名函数...如果有,出了自己作用域,声明变量就会立即被销毁了。...在这里简单介绍一下:闭包是可以访问在函数作用域内定义变量函数。若要创建一个闭包,往往都需要用到匿名函数。 2、模拟块级作用域,减少全局变量。...执行完匿名函数,存储在内存中相对应变量会被销毁,从而节省内存。再者,在大型多人开发项目中,使用块级作用域,会大大降低命名冲突问题,从而避免产生灾难性后果。

    10.3K10

    JS面试、技巧总结点一-变量提升函数提升

    但只有声明本身会被提升,而赋值或其他运行逻辑会留在原地 javascript并不是严格自上而下执行语言 变量声明提升: JavaScript变量提升是针对var,而let和const不存在变量提升这一特性...(let与const具有一个临时死区概念,后续在es6总结中会提到) 通过var定义变量,在定义语句之前就可以访问到 值:undefined 变量提升就是变量会被提升到作用域最顶上去,也就是该变量不管是在作用域哪个地方声明...JS 解释器会找出需要提升变量和函数,并且给他们提前在内存中开辟好空间,函数的话会将整个函数存入内存中,变量只声明并且赋值为 undefined, 第一个定义声明是在编译阶段进行。...fn作用域顶端,第一输出则为undefined 下面这段代码,由于es6之前,js是没有块级作用域,所以 if 中声明a变量会被当成全局变量处理 var a = 1 if (true) {...没有使用var定义,会造成fx函数中没有变量声明,所以 fx 里面访问变量a,其实都是访问全局变量a,a = 20 又相当于给全局变量a重新赋值20 函数声明提升 通过function声明函数,在之前就可以直接调用

    78120

    Js中类定义和继承

    定义类 function Person() { // 属性 this.name = "张三" this.age = 20 // 方法 // 实例方法,需要new才能被调用...new per.talk = function () { console.log("我是静态方法") } // 调用静态方法 per.talk() // 通过原型链拓展属性和方法 // 原型链上属性会被多个实例共享...对象冒充继承 // 对象冒充继承 function Woman() { //对象冒充可以继承函数属性和方法,无法继承原型链上 Person.call(this) } var wom...= new Woman() wom.run() //父类函数里方法 原型链继承 // 原型链继承 function Man() {} // 原型链可以继承函数和原型链上属性和方法 Man.prototype...= new Person() var man = new Man() man.run() //父类函数里方法 man.work() //父类原型链里方法 子类给父类传参 对象冒充+原型链 function

    2.3K40
    领券