1、变量提升只针对等号左边进行提升~~~~
sum()
a()
var a = function() {
console.log(1)
}
function sum() {
console.log(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文件中的任意位置调用这个函数
-
变量提升只会提升等号左边的部分; 不会提升右边的部分
// 2种情况
//1.变量声明----只会提升等号左边的部分
var a = 1;
//2.函数声明-------只会提升等号左边的部分
var fn = funtion (){}
-
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.所有的自执行函数本身都不会进行变量提升
- 7.return 后边的内容 是不会进行~~~~变量提升的
- 8但是return 下边的代码是可以进行变量提升的
- 9.
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~~~~
例题
分析:
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