### 只对等号左边进行变量提升
/*
* 变量提升
* var fn; =>只对等号左边的进行变量提升
* function sum => 声明加定义
*/
sum(); // 2
//fn(); // fn is not a function
// => 匿名函数之函数表达式
var fn = function(){
console.log(1);
} //=> 代码执行到此处会把函数赋值给FN
// =>普通的函数
function sum(){
console.log(2);
}
sum(); // 2
fn(); // 1
// 真实项目中,尽量用函数表达式
### 条件判断下的变量提升
/*
* 在当前作用域下,不管条件是否成立都要进行变量提升
* => 带VAR的还是声明
* => 带FUNCTION的在老版本浏览器渲染机制下,声明+定义都处理,但是为了迎合ES6中的块级作用域,新版本浏览器对于函数(在条件判断中的函数),不管条件是否成立,都只是先声明,没有定义,类似于VAR。
*/
console.log(a); // undefined
if (1===2) {
var a = 12;
}
console.log(a); // undefined
/*
* 变量提升; 》 在全局作用域下声明的全局变量也相当于给window设置了一个属性window.a = undefined
*/
console.log(b); // undefined
if ('b' in window) {
var b = 100;
}
console.log(b); // 100
// 面试题:
/*
* 变量提升:无
*
*/
f = function(){return true}; //window.f (true)
g = function(){return false}; //window.g
~function(){
/*
* 变量提升
* function g; //=>g是私有变量
*/
if(g() && []== ![]){ //g is not function(此时的g是undefined)
f = function(){return false}
function g(){return true}
}
}();
console.log(f());
console.log(g());
/*
* 变量提升:
* function fn;
*/
console.log(fn); //undefined
if(1===1){
// => 当条件成立,进入到判断体中,(在es6中它是一个块级作用域),第一件事并不是代码执行,而是类似于变量提升一样,先把FN声明和定义了,也就是判断体中代码执行之前,FN就已经赋值了。
console.log(fn); // =>函数本身
function fn(){
console.log('ok');
}
}
console.log(fn) // =>函数本身
### 重名问题的处理
/*
* 1.带VAR和FUNCTION关键字声明的相同的名字,这种也算是重名了(其中是一个FN,只是存储的类型不一样)
*/
// var fn = 12;
// function fn(){}
/*
* 2.关于重名的处理:如果名字重复了,不会重新的声明,但是会重新的定义(重新赋值)【不管事变量提升还是代码执行皆是如此】
*/
// 面试题
/*
* 变量提升:
* fn = 。。。(1)
* = 。。。(2)
* = 。。。(3)
* = 。。。(4)
*/
fn(); //4
function fn(){console.log(1);}
fn(); // 4
function fn(){console.log(2);}
fn(); // 4
var fn = 100;
fn(); // 报错
function fn(){console.log(3);}
fn();
function fn(){console.log(4);}
网友评论