变量提升,声明提升,函数表达式不提升。最后执行匿名函数; 用function定义的函数声明会直接提升到最顶层(区分函数表达式)

发布时间 2023-11-15 12:46:36作者: 龙陌

以下代码执行后, num 的值是?

var foo=function(x,y){
    return x-y;
}
function foo(x,y){
    return x+y;
}
var num=foo(1,2);

A
-1

B
3

C
1

D
2

正确答案:A

选A。该题考察的是JS解析顺序。
根据题干:
匿名函数,需要通过变量引用指向函数的运行结果。
var foo=function(x,y){
//赋值式函数 return x-y;
}

有名函数,可以单独定义。
function foo(x,y){
//声明式函数 return x+y;
}

实际调用 var num=foo(1,2); //调用赋值式函数 return x-y 为 -1

变量提升,声明提升,函数表达式不提升。最后执行匿名函数

函数提升优先级高于变量提升,且不会被同名变量声明时覆盖,但是会被变量赋值后覆盖。

考点:函数提升、变量提升

//实际代码过程如下:
function foo(x,y){ //函数是一等公民,
return x+y; //用function定义的函数声明会直接提升到最顶层(区分函数表达式)
}
var foo; //函数表达式中的变量提升
var num; //普通变量的变量提升
foo = function(x,y){ //赋值后此时foo是这个函数,不是最上面的那个了
return x-y;
}
num = foo(1,2);

js预解析机制,

js会预解析var和function这两个关键字,并给var赋值undefined,即