javascript作用域优先级面试题

优先级:声明变量 > 声明普通函数>参数>变量提升

  • 声明变量:var a=10;var b=function(){}
  • 声明普通函数:function a(){}
  • 参数:function(arg){console.log(arg)}
    注意普通的声明函数是不看写函数顺序的,函数声明会被提升到当前作用域的顶部。例如下面写法
function test(){
  var a;
  function a(){
  }
  console.log(a);//f a(){}
}
test();
/*
相当于
function test(){
  function a(){
  }
  var a;//注意这里并没有赋值
  console.log(a);//f a(){}
}
test();

*/

练习题1

//声明变量>声明函数
  function fun() {
    var a = 10;//声明变量
    function a() {}//声明函数
    console.log(a); //10
  }
  fun();

练习题2

//函数声明变量提升
function fun1() {
  console.log(a); //f a(){}
  function a() {}
}
fun1();

练习题3

   function a() {
        console.log(a); //undefined
        var a = function () {
          console.log(a); //a(){}
        };
        a();
      }
    a();
/*
上面代码相当于
function a(){
  var a;
  console.log(a);//a没有赋值所以undefined
  a=function(){
    console.log(a);//此时a已经被function()所赋值
  }
  a();
  
}
*/

练习题4

//声明普通函数>参数
  function fun2(a) {
    console.log(a); //f a(){}
    function a() {//声明普通函数
      console.log(a);//f a(){}
    }
    a();
  }
  fun2(10);

练习题5

//参数>变量提升
function fun2(a) {
    console.log(a); //10
    var a = function () {}; //变量提升
  }
fun2(10);



// 参数 > 变量提升
  function fun3(a) {
    console.log(a); //14
    var a = 12;//变量提升
  }
  fun3(14);

练习题6

//变量重新赋值
function fun4(a) {
    var a = 12;
    console.log(a); //12
  }
fun4(14);

综合练习1

 var b = "boy";
 console.log(b);
    function fighting() {
      console.log(a);
      console.log(c);
      if (a == "apple") {
        c = "Alice";
      } else {
        a = "Ada";
      }
      console.log(a);
      var a = "Andy";
      middle();
      function middle() {
        console.log(c++);
        var c = 100;
        console.log(++c);
        small();
        function small() {
          console.log(a);
        }
      }
      var c = (a = 88);
      function bottom() {
        console.log(this.b);
        b = "baby";
        console.log(b);
      }
      bottom();
    }
    fighting();
    console.log(b);
    /*
    输出结果
      boy
      undefined
      undefined
      Ada
      NaN
      101
      Andy
      boy
      baby
      baby
    */

综合练习2

 function test(a, b) {
        console.log(a);//a(){}注意后面有声明函数a,会提升到前面,而且声明函数>参数
        console.log(b);//undefined 注意这里的undefined不是之后的var b变量提升的结果 而是参数b为undefined
        var b = 234;
        console.log(b);//234   变量重新赋值
        a = 123;
        console.log(a);//123 变量重新赋值
        function a() {}//普通函数声明
        var a;
        b = 234;
        var b = function () {}; 
        console.log(a);//123 变量重新赋值
        console.log(b);//function(){}  变量重新赋值
      }
      test(1);
  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值