首页 > 试题广场 >

以下代码执行后,num 的值是?var foo&nbs...

[单选题]
以下代码执行后,num 的值是?var foo = function(x, y){
return x - y;
}
function foo(x, y){
return x + y;
}
var num = foo(1, 2);
  • 1
  • 2
  • 3
  • -1
知识点:hoisting
var foo = function(x, y){
    return x - y;
}
function foo(x, y){
    return x + y;
}
var num = foo(1, 2);

会被javascript编译器处理为:

//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。

如解释有误,还请不吝指正 🤣
refs:
1. https://developer.mozilla.org/en-US/docs/Glossary/Hoisting
2. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var
3. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function
4. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/function
5. https://stackoverflow.com/questions/40675821/what-happens-when-javascript-variable-name-and-function-name-is-the-same

编辑于 2018-12-20 20:38:42 回复(2)
关于这道题,不管是变量的提升优先还是函数的提升优先,最后执行的一定赋值操作即: foo = xxx
所以结果是-1
发表于 2019-09-10 18:20:24 回复(0)
var foo = function(x, y){
return x - y;
}
function foo(x, y){
return x + y;
}
var num = foo(1, 2);

函数会比变量先提升;
编译后为
function foo(x, y){
return x + y;
}
var foo;
var num;
foo = function(x, y){
return x - y;
}
num = foo(1, 2);
发表于 2019-09-06 20:29:10 回复(1)
考点:变量提升,变量提升时只提升等号左边的,右边的赋值操作最后执行,而function定义的函数变量提升时是顺便赋值的,所以后来被覆盖了

发表于 2019-09-18 22:08:39 回复(0)
// 变量声明<函数声明<变量赋值
            // 也就是函数声明可以覆盖同名的变量声明,但是函数声明没办法覆盖被赋值之后的变量,赋值变量反而会覆盖函数,但是需要注意变量赋值的顺序
            // var a=3;
            // function a(){
            //     console.log('i am')
            // }
            // console.log(a);
            // 相当于
            /* function a(){
                console.log('i am')
                }
                var a;
                a=3;
                console.log(a);//3
                // 因为函数声明没办法覆盖被赋值的变量
             */
            
            function a(){
                console.log('i am')
            }
            console.log(a);//fn(){}
            var a=3;
            console.log(a);//3
            // 此时预解析顺序为
            /* function a(){
                console.log('i am')
                
                var a;//虽然再次声明了a,但是存在了同名函数,所以等于没用
                console.log(a);
                a=3;//虽然存在同名变量赋值,但是执行顺序在打印之后,所以还是打印函数
                console.log(a);//而在此时,变量a已经被赋值了,而变量赋值会覆盖函数声明,所以打印变量a
             */
发表于 2019-08-26 17:20:39 回复(0)