目录
一.作用域问题
虽然本节主要讲解变量提升和函数提升的概念,但是必须先搞懂js中作用域的概念,直接通过代码来简单讲解一下,上代码
预解析 js引擎会把js里面所有的var,还有function提升到当前作用域的最前面
var c='local';
function c1(){
var b='lv';
console.log(c);
console.log(b);
}
反观b它定义在函数体内部,所以只能在函数体内输出b,为一个块级作用域。
此段代码中,我们先来看变量c,变量c定义在函数体外,所以被称为全局变量,所以在函数体里和外都能访问到变量c,此处为一个全局作用域
观察下面代码:此处在花括号内部定义变量,内部输出为niv,在外部输出v,l浏览器控制台报错,v未被定义,此处观察到一个块级作用域。
{
let v='niv'
log(v)
}
log(v)
二.变量提升
console.log(num);//undefined坑1
var num=10;
//相当于执行了以下代码
var num;//先进性变量声明
console.log(num);
num =10;
按照代码解析,这就是一个基础的变量提升原理
变量提升就是把所有的变量提升到当前作用域最前面 不提升赋值操作
三.函数提升
var fun =function(){
console.log(22);
}
//相当于执行了一下代码
//函数表达式写在函数声明的后面
//利用管家字声明的函数,才能自动提升,函数表 达式不能
// 函数表达市场必须写在函数声明的下面
var fun;
fun();
fun=function() {
console.log(22);
}
按照代码解析,这就是一个基础的函数提升原理
函数提升 就是所有的函数声明提升到当前作用域的最前面 不调用函数
四.函数提升和变量提升的优先级问题
//函数优先级
console.log(a);
console.log(a());
var a=1;
function a(){
console.log(2);
}
a=3;
console.log(a);
console.log(a());
//相当于一下代码
//函数优先提升
function a(){
console.log(2);
}
var a;
console.log(a);//function a
console.log(a());//2
a=1
a=3
console.log(a);//3
console.log(a());//a不是一个函数
// 函数提升的优先级高于变量提升
//对于相同名称变量声明不会覆盖掉函数声明的
//但是变量赋值会覆盖函数
五.条件判断下的变量提升
/*
变量提升: function fn;
*/
console.log(fn) //undefined
if(1==1){
/*
变量提升:(fn)===> 函数体内容
*/
console.log(fn); //函数本身 当条件成立时,进入到判断体中,就会在当前的if语句形成的块级作用域中(ES6语法),在代码执行前,进行与类似变量提升的操作一样吗,将带有function关键字的函数进行声明(由于之前声明过了,便不再重复声明)和赋值(这里会进行赋值),也就是if语句中的代码执行前,fn函数已经被赋值了。
function fn(){
console.log("ok");
}
}
console.log(fn)
以上就是今天内容,再见!