0
点赞
收藏
分享

微信扫一扫

预解析的基本原理

婉殇成长笔记 2022-02-03 阅读 98

目录

一.作用域问题

  二.变量提升

    三.函数提升

  四.函数提升和变量提升的优先级问题


一.作用域问题

虽然本节主要讲解变量提升和函数提升的概念,但是必须先搞懂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)

  以上就是今天内容,再见!

举报

相关推荐

0 条评论