一:函数表达式中的函数并不会被预解析
首先需要知道什么是函数声明与函数表达式、以下是他们的区别:
// 函数声明
fn(); // 没有出错
function fn (){
console.log('test')
}
// 函数表达式
// fn1();// undefined 出错 原因是?
var fn1 = function (){
console.log('test')
}
// 注意虽然fn1的值是一个函数,但这里并不是定义,而是赋值操作。js在解析的时候只会预解析函数的定义和变量的定义。所以fn1 的值 函数并不会被预解析
函数表达式的预解析过程是这样的:
var fn1;
fn1();// undefined 出错
fn1 = function (){
console.log('test')
}
二:if条件中的函数是不会被预解析(提升)的。现代浏览器
在IE 9之前的浏览器 if语句中的函数是可以被提升的
- 注意if条件中的函数声明在老版本的IE浏览器中是可以被提升的,在现代浏览器中不可以被提升
- 但if条件中的函数表达式是不论在老版本还是现代浏览中的都是一样的,都不会被提升
注意:这里不是if条件{}
作用域的影响。因为只有函数才会开启作用域
if(true){
function fn(){
console.log('fn-true')
}
}else {
function fn(){
console.log('fn-false')
}
}
fn();// 依然是true。条件中的函数没有被提升