2

1、变量提升只针对等号左边进行提升~~~~

sum()
a()
var a = function() {
    console.log(1)
}
function sum() {
    console.log(2)
}
  1. 变量提升只针对等号左边进行提升
  2. 如上题:正确执行顺序是
function sum(){
    console.log(2)
}
var a;
sum();    //2
a();      //报错 a is not a function~~~~
function(){
    console.log(1)
}

2、当前作用域内,不管条件语句是否成立,都要进行变量提升

3、一些总结

变量提升
  • 在JS代码执行之前,浏览器要先过一遍代码,把其中带var和带function 关键字内容提前声明
  • 带var 是只声明(给个默认值undefined) 不定义
  • 带function 声明+定义

*

  • 因为 用function 关键字声明的函数 在变量提升阶段已经赋值完成, 所以我们可以在JS文件中的任意位置调用这个函数

*

  • 变量提升只会提升等号左边的部分; 不会提升右边的部分

*

  • var 一个变量,相当于给window添加一个属性
  • 带var 会进行变量提升,不带var 的没有变量提升

*

  • var a=12;
  • let a=12 ; 不能重复声明

*

  • const =66; 声明常量用的 既不能重复声明,也不能重复定义
  • const 没有变量提升*/

/*变量提升 是不看条件成不成立的 这个是针对var 来说的

  • 针对 function来说,在条件语句中的function声明;标准浏览器下只是声明,不定义的,
  • 在IE低版本,是既声明 又定义的*/

变量提升的特殊情况

  • 1.只提升 等号左边的内容
  • 2.不管条件是否成立 都要进行变量提升;
  • 3.对于function声明比较特殊,在标准浏览器下,只声明,不定义
  • 4.在IE,低版本 是 既声明,又定义
  • 5.所有的匿名函数 都是不会进行变量提升的
  • 6.return 后边的内容 是不会进行~~~~变量提升的
  • 7但是return 下边的代码是可以进行变量提升的
  • 8.所有的自执行函数都不会进行变量提升
  • 9.image.png

es6 的声明

  • let/const创建的变量、函数,没有变量提升;也不会给window添加属性
  • let a = 12; 不能重复声明(会报错),~~~~但是能重复定义
  • const b=12 ; 声明一个常量 不能重复声明,不能重复定义*/
console.log(a)   //报错
let a = 1


let b = 2;
console.log(b)      //2~~~~
console.log(window.b)//undefined~~~~

例题

image.png
分析:

var a = 12,
    b = 13,
    c = 14
function fn(a) {
    /*
    1、形参赋值a=12    =>是私有变量
    2、变量提升 var b; =>是私有变量
    */

    console.log(a, b, c) //12 undefined 14 =>c是全局变量
    /*
     b=20
     c=20
     a=20
    */
    var b = (c = a = 20) //c改变了全局变量,a、b是私有变量
    console.log(a, b, c) //20 20 20
}
fn(a)
console.log(a, b, c) //12 13 20

麦子
23 声望3 粉丝

学习前端