函数声明与函数表达式及变量声明提升的底层实现

本文探讨了JavaScript中函数声明与函数表达式的区别及执行顺序。通过具体代码示例,解析了函数声明优先级高于变量声明的现象,以及变量声明提升的概念。深入理解这些特性有助于避免编程中的常见陷阱。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

函数声明与函数表达式

疑问1: 

 var aa = function () {
        console.log(2)
    }

    function aa() {
        console.log(1)
    }

    aa()  //2
  function aa() {
        console.log(1)
    }

var aa = function () {
        console.log(2)
    }

    aa()  //2

疑问2: 

 function aa() {
        console.log(1)
    }
    var  bb=aa;
    aa = function(){
       console.log(2)
   };
   aa()  //2
   bb()  //1
function aa() {
        console.log(1)
    }
    var  bb=aa;
    function aa() {
       console.log(2)
    }
   aa()  //2
   bb()  //2

 

找的一个解释,但是依旧存疑。他这说法不太靠谱

函数的声明比变量的声明的优先级要高

 1 function text6() {
 2   function a() {}
 3   var a;
 4   log(a);                //打印出a的函数体
 5 
 6   var b;
 7   function b() {}
 8   log(b);                 //打印出b的函数体 
 9 
10   // !注意看,一旦变量被赋值后,将会输出变量
11   var c = 12
12   function c() {}
13   log(c);                 //12
14   
15   function d() {}
16   var d = 12
17   log(d);                //12
18 }
19 text6();

 

另一种较为合理的解释 

变量声明提升

即所有声明变量或声明函数都会被提升到当前函数的顶部。

例如下代码:

console.log('x' in window);//true
var x;
x = 0;
//代码执行时js引擎会将声明语句提升至代码最上方,变为:

var x;
console.log('x' in window);//true
x = 0;

函数表达式

var getName 与 function getName 都是声明语句,区别在于 var getName 是函数表达式,而 function getName 是函数声明。关于JS中的各种函数创建方式可以看 大部分人都会做错的经典JS闭包面试题 这篇文章有详细说明。

函数表达式最大的问题,在于js会将此代码拆分为两行代码分别执行。

例如下代码:

console.log(x);//输出:function x(){}
var x=1;
function x(){}

实际执行的代码为,先将 var x=1 拆分为 var x; 和 x = 1; 两行,再将 var x; 和 function x(){} 两行提升至最上方变成:

var x;
function x(){}
console.log(x);
x=1;

所以最终函数声明的x覆盖了变量声明的x,log输出为x函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值