首页 > 试题广场 >

执行以下程序,输出结果为() var a = 2; func

[单选题]
执行以下程序,输出结果为()
var a = 2;
function fn(){
  b();
  return ;
  var a = 1;
  function b(){
    console.log(a);
  }
}
fn();




  • 1
  • 2
  • undefined

  • 抛出异常

这是考察JS中提升(hoist)的问题,也就是变量提升和函数提升

要注意几个点

  • 1.函数声明提升优先级高于变量声明提升
  • 2.提升就是声明(变量/函数)提至当前作用域的最顶部,赋值语句留在原地
  • 3.函数创建有3个形式,函数声明和函数表达式 以及 new Function构造函数。
  • 4.只有函数声明才有函数提升。...其实2个都有提升,表达式提升的是变量了。
//原来的代码
var a = 2;
function fn(){
        b();
        return ;
        var a = 1;
        function b(){
            console.log(a);
        }
}
fn();

//实际上的代码
var a = 2;
function fn(){
    function b(){
      console.log(a);
    }
    var a //变量声明提升,默认赋值为undefined
    b(); //执行函数b,在当前作用域找到a,值为undefined
    return;//return后面的语句不再执行,a没有被赋值为1
    a = 1; //在原来的位置才会赋值,但不会执行到这里
}
fn();

函数声明和函数表达式的区别(以及提升的不同)

  • 就是function左边没有东西就是函数声明,有就是表达式
//函数声明
  function f1(){
    console.log('我是函数声明')
  }
  //函数表达式
  var f2 = function () {
    console.log('我是函数表达式')
  }

函数发生提升后
// 函数声明--提升
function f1() { 
  console.log('我是函数声明')
}
var f2;
f1() //'我是函数声明'
f2() //error:f2 is not a function
// 函数表达式
f2 = function() {
  console.log('我是函数表达式')
}
JS中所有声明(val / let / const /function() /class / function*)  都存在提升,不过像let const class这些因为TDZ的原因‘表现’得像没有提升。

编辑于 2022-01-07 15:57:42 回复(5)
虽然return语句可以终止函数,但是return语句后如果有变量和函数声明,仍然存在变量提升和函数提升。
1.函数声明提升优先级高于变量声明提升
2.提升就是声明(变量/函数)提至当前作用域的最顶部,赋值语句留在原地
3.函数创建有3个形式,函数声明和函数表达式 以及 new Function构造函数。
4.只有函数声明才有函数提升。...其实2个都有提升,表达式提升的是变量了。
【转载】
编辑于 2022-07-11 17:57:35 回复(0)
函数b和 a 的定义都变量提升,但是a 的赋值并不会提升,输出 a 为 undefined
发表于 2023-02-11 23:13:33 回复(0)
这个是函数的预编译问题,根据预编译的步骤得到最后AO对象里面为 a:undefined; b:function(); 所以b()开始执行的时候,打印a,因为此时自己AO里面有a,优先输出自己的AO里面的a,又因为a是undefined,所以输出为undefined,然后return 终止
发表于 2022-11-07 22:55:29 回复(0)
不能只想到函数声明的提升,变量声明也提升了,但是还没有被赋值,所以是undefined
发表于 2023-06-02 21:14:17 回复(0)