1.首先最常见的一种变量提升
console.log(a); //输出 undefined
var a=10;
console.log(a) // 输出 10
var 有提升的作用其实上面的代码会变成会变成
var a;
console.log(a); //输出 undefined
a=10; //赋值留在原地
console.log(a) // 输出 10
2.if语句中的 var
var a=5;
if(a==5){ // if语句没有 语句块的作用 所以没有闭包的作用 这里的a是
console.log(a); //输出5
var a=3; //再 if语句中声明的变量 也是一个全局变量 所以这个a=3 会把前面的 5覆盖
console.log(a); //输出3
}
console.log(a); //输出3
3.function的提升
var a;
function a(){console.log(123)};
a(); //输出 123 再js中函数是第一公民 会比var声明的的变量更靠前
var a;
function a(){console.log(123)};
function a(){console.log(456)}
a(); //输出 456 再js中函数是第一公民 后面的 a函数把前面的
覆盖 js只会存在一个同名变量 函数声明的变量是以一个地址的形式存储在内存中 同时 js中如果已经存在 一个同名的变量且已经赋值 在重新定义的没有赋值的变量 就会跳过初始化阶段
function a(){console.log(123)};
function a(){console.log(456)}
var a=10;
a(); //输入引用错误 a不是一个函数 这个时候又定义了一个a变量 会把前面同名的函数给覆盖掉 js是弱数据类型 这个时候 a就变成了一个number类型 所以 报出了 a不是一个函数
4.function 和 var 的 一起使用
var b=10;
function a(){ //函数具有局部作用域的效果 所以内部和外面的全局作用不通
console.log(b); //输出undefined
var b=8;
console.log(b); //输出 8
}
a(); //记住函数只有调用才有用 别忘了调用
console.log(b); //输出 10
5.if语句
if (!("a" in window)) {
var a = 1;
};
alert(a);
上面的语句相当于
var a;
if (!("a" in window)) { //判断 a是否在全局变量中 如果不再则会将 a赋值 1 大家记住在 if语句中 var声明的变量 也是一个全局
a = 1; // 变量 ,而并不会 在一这个条件是否成立 js在执行程序之前 会首先把在全局中用var 声明的变量提前
};
alert(a); // 弹出 undefined
6.练习 下面这个难度有点大 是一个es6的闭包的知识 答案我就不公布 闭包作用就是利用了函数作用域和外部不通的原理防止全局污染
var name="world";
(function(){
console.log(name)
if(typeof name==="undefined"){
var name="jack";
console.log("goodbye "+name)
}else{
console.log("hello "+name)
}
}())
7. 还有一种特殊情况 感兴趣的童鞋可以去了解下哈 就是 es6新增的块级作用域 中的 函数提升
var a = 100;
{
a = 10;
function a() {}
a = 20;
}
console.log(a)
块级作用域中的函数提升 类似于 var 但是 和var 又不全一样
块级作用域中的函数提升 只是提升到 块级作用域的顶部 但 并不是立即映射到全局 这个也是为啥那个全局中的a发生了变化 当这个声明语句走完 才正式在块级作用域中生效
关注我 持续更新 前端知识