zoukankan      html  css  js  c++  java
  • 函数提升和变量提升,以及他们的优先级

    一、变量提升

    在ES6之前,JavaScript没有块级作用域(一对花括号{}即为一个块级作用域),只有全局作用域和函数作用域。变量提升即将变量声明提升到它所在作用域的最开始的部分。

    (1) 创建函数有两种形式,一种是函数声明,另外一种是函数字面量,只有函数声明才有变量提升

    console.log(a)  // f a() { console.log(a) }
    console.log(b) //undefined
    	
    function a() {
    		console.log(a) 
    }
    
    var b = function(){
    		console.log(b)
    }
    

    相当于

    var a = 'function'
    var b
    console.log(a)
    console.log(b)
    

    (2)变量提升

    console.log(c);   //undefined
    var c = "第一次没打印出来,第二次才出来";
    console.log(c);   //第一次没打印出来,第二次才出来
    function fn(){
    		console.log(d); //undefined
    		var d = '和前面的一样啊';
    		console.log(d); //和前面的一样啊
    }
    
    fn();
    

    其实,就相当于

    var c ;
    console.log(c)
    c = " xxxx "
    console.log(c)
    

    二、函数提升与变量提升的优先级

    console.log(a);    // f a() {console.log(10)}
    console.log(a());    //  undefined
    var a = 3;
    
    function a() {
    		console.log(10) //10
    }
    console.log(a)   //3
    a = 6;
    console.log(a());  //a is not a function;
    

    原理 :

    	var a = funtion () {
    		console.log(10)
    	}
    	var a;
    	console.log(a);    // f a() {console.log(10)}
    	console.log(a());  //  undefined
    
    	a = 3;
    	console.log(a)   //3
    	a = 6;
    	console.log(a());   //a() is not a function;
                
    

    由此可见函数提升要比变量提升的优先级要高一些,且不会被变量声明覆盖,但是会被变量赋值之后覆盖。

  • 相关阅读:
    [P4721] 【模板】分治 FFT
    [GYM102452E] Erasing Numbers
    [LOJ6220] sum
    [CF776B] Sherlock and His Girlfriend
    [LOJ6087] 毒瘤题
    [LOJ2612] 花匠
    [LOJ529] 自然语言
    [CTSC2017] 吉夫特
    [LOJ6671] EntropyIncreaser 与 Minecraft
    [LOJ3196] 挂架
  • 原文地址:https://www.cnblogs.com/oxiaojiano/p/7918967.html
Copyright © 2011-2022 走看看