首页 > 试题广场 >

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

[单选题]

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

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

  • -1
  • 3
  • 1
  • 2
推荐
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


编辑于 2019-08-20 14:14:36 回复(4)
知识点:hoisting
1
2
3
4
5
6
7
var foo =function(x, y){
   return x - y;
}
function foo(x, y){
   return x + y;
}
var num = foo(1, 2);

会被javascript编译器处理为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//variable hoisting变量提升
var foo;//foo#1
var num;
 
//function declaration hoisting函数声明提升
function foo(x, y){//foo#2
   return x + y;
}
 
//function expression NOT hoisted函数表达式不会被提升
foo =function(x, y){//foo#3
   return x - y;
}
 
num = foo(1, 2);//这里使用foo#3

规则
1. 变量声明、函数声明都会被提升到作用域顶处;
2. 当出现相同名称时,优先级为:变量声明(foo#1) < 函数声明(foo#2) < 变量赋值(foo#3)

因此,num计算时是用的foo#3。答案为-1。

发表于 2019-08-19 17:21:22 回复(15)
var foo = function (x, y) { // 函数声明会被提升
    return x - y
}

function foo(x, y) { // 函数声明会被提升,因此最后执行 foo = function(x, y) { return x - y }
    return x + y
}

var num = foo(1, 2) // -1

发表于 2021-06-25 17:40:26 回复(0)
函数提升优先级高于变量提升,且不会被变量声明覆盖,但会被变量赋值覆盖
function foo(x,y){return x+y;}//函数声明优先于变量提升
var foo;
foo=function(x,y){return x-y;}//变量赋值覆盖了函数声明
var num=foo(1,2);


发表于 2020-03-26 15:49:07 回复(3)
看完这个就对变量和函数提升完全懂了
发表于 2020-07-14 15:54:50 回复(4)
考察 js 解析顺序
// 变量提升
var foo; 
var name;
// 函数声明提升
function foo(){
    return x+y;
}
 
foo = function(x,y) {
    return x-y;
}
name = foo(1,2);

发表于 2020-08-21 11:39:57 回复(0)
我的理解是,js解释代码前会对代码进行编译,这过程会将变量声明,函数声明提升,这 过程foo的变化为:foo:undefined(变量提升)->foo:function fon(x,y){return x+y}(函数提升,由于名称一样,覆盖了前foo),所以开始执行代码前,foo指向的是return x+y函数,如果是在第一行执行var num =fon(1,2),结果num会为3,之所以为-1,是由于执行了foo=function(x,y){return x-y}(赋值不会被提升),将编译结果覆盖了,所以后面执行的结果就为-1了
发表于 2019-10-03 16:06:20 回复(0)
考点:函数提升、变量提升

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

发表于 2022-01-06 16:17:01 回复(0)
变量提升后:
function foo(x, y) {
            return x + y;
        }
        var foo;
        var num;
        foo = function (x, y) {
            return x - y;
        }
        num = foo(1, 2);
后面的把前面的覆盖了,所以执行了
foo = function (xy) {
            return x - y;
        }
这样对吗?
发表于 2022-06-29 15:48:51 回复(0)
函数提升高于变量提升,也就是先function foo,再var foo。但是,同名时变量被覆盖了之后就不会改变(这里是function foo被var foo覆盖了),所以即使function foo的定义在下边,他也改变不了已经被变量覆盖的foo。 (百度这么说的)
发表于 2021-07-08 01:21:26 回复(0)
js预解析机制,
js会预解析var和function这两个关键字,并给var赋值undefined,即
var foo = undefined
function foo(x,y){
    return x+y
}
var num = undefined

解析结束后运行程序
var foo = function(x,y){
    return x-y
} //给foo赋值

var num = foo(1,2)

所以foo赋值的是x-y这个函数



发表于 2019-11-03 15:31:48 回复(0)
变量提升
1. var foo
2. var num
3. function foo(x, y) { return x + y } // 函数声明提升
4. foo = function(x, y) { return x - y }
5. num = foo(1, 2) // 就近原则,执行“4”行代码
发表于 2022-03-17 14:33:41 回复(0)

   var foo=function(x,y){                 //1
    return x-y;                                  
    }
    function foo(x,y){                       
    return x+y;
    }
    var num=foo(1,2);                        //3
1.创建全局变量对象Go,找出变量声明并赋值undefined
Go {
    foo : undefinded,
    num:undefinded
}
2.找到函数声明,并赋值函数体
Go {
     foo : function foo (x,y) {    //foo=3
            return x+y;
            },
     num:undefinded
}
3.执行程序1
Go {
     foo :-1
     num:undefinded
}
4.2在全局预编译已执行,执行语句3
Go {
     foo : -1
     num:-1
}

发表于 2019-09-04 11:09:14 回复(0)
函数声明优先变量声明,这里关键在于foo 赋值是在一句,所以 ,比如 下面这个
console.log(sayHi)   // 函数优先变量声明,ƒ sayHi() { console.log("hi"); }

var sayHi = "sayHi" // 重新赋值
function sayHi() {
    console.log("hi")
}

console.log(sayHi)   // sayHi


发表于 2021-05-14 14:36:44 回复(0)
变量声明、函数声明都会被提升到作用域顶处; 当出现相同名称时,优先级为:变量声明< 函数声明< 变量赋值
发表于 2021-03-22 23:08:56 回复(0)
 var foo=function(x,y){
            return x-y;
        }
        function foo(x,y){
            return x+y;
        }
        var num=foo(1,2);
        console.log(num);

        //变量提升后
        var foo;
        var num;
        function foo(x,y) {
            return x+y;
        }
        foo=function(x,y){
            return x-y;
        }
        foo(1,2);
        console.log(num);

发表于 2020-06-05 12:05:46 回复(0)

b  变量声明的“提前”的区别。

发表于 2019-08-19 15:22:27 回复(1)
发表于 2022-09-04 00:25:42 回复(0)
函数比变量优先提升,赋值类函数foo相当于对于定义类函数foo的覆盖,可以这样理解么?
发表于 2022-08-19 15:53:24 回复(0)
函数提升优先级比变量提升要高,且不会被变量声明覆盖,但是会被变量赋值覆盖。


发表于 2021-10-15 12:18:27 回复(0)
一般情况下:函数提升优先级比变量提升要高,且不会被变量声明覆盖,但是会被变量赋值覆盖。
但是:同一个标识符的情况下,变量声明与函数声明都会提升;函数声明会覆盖变量声明,但不会覆盖变量赋值,即:如果声明变量的同时初始化或赋值那么变量优先级高于函数。
发表于 2021-10-04 20:39:18 回复(0)