JavaScript作用域及几道面试题

我们搞懂了作用域,才能更清楚的知道代码的执行顺序!

作用域:

// 域:空间、范围、区域……
// 作用:读、写


script 全局变量、全局函数
自上而下

函数
由里到外

{}


//1 当我们使用一个变量时,如果当前作用域中含有这个变量的声明语句,就不会查找外面的其他作用域
          //console.log(num);
          //var num = 200;
          
          //2 当我们在某个作用域中使用变量时:使用情况有两种
          //2.1 直接使用
          //console.log(num);
          //当前作用域中没有这个变量的声明,会向父级作用域查找
          //如果找到了这个变量,使用父级作用域中这个变量的值
          //如果没有找到,继续向上查找。。最终找到全局作用域,如果还没有,报错;
          
          //2.2 进行赋值
          //num = 100;
          //当前作用域中没有这个变量的声明,会向父级作用域查找
          //如果找到了这个变量,修改父级作用域中这个变量的值
          //如果没有找到,继续向上查找。。最终找到全局作用域,如果还没有,会创建一个全局变量;
          

          //作用域链的访问规则


//       下面有几道有意思的关于作用域的面试题;



alert(a);     //1、js预解析 找var function 等关键字;


function a(){

alert(2)

}
var a = 1; // 找到var a 之后,不会往后面找了,此时 a = undefine


alert(a); //  解析器接着找到 function a (){alert(2)} 函数块。 
//1
function a () { 

alert(2) 

} // 此时变量a和函数a 同名 JS解析器只会留下一个a ;所以变量a被JS解析器删除掉,只留下function a(){ alert (2)}; 然后继续往


alert(a); //
// 1
var a = 3; // 下找到var a 同上面一样只留下function a(){ alert (2)}, 接着再找到function a(){alert(4)},替换上面的function


alert(a);
// 3
function a () { alert(4); } // 所以最后在JS解析器中 a就等于function (){alert(4)}


alert(a); // 2 逐行执行代码。


// 3 此时JS解析器中 a=3//表达式可以改变解析器中的值
a(); //会报错 a is a not function


// --------------------------------我是快乐的分割线-------------------------------------


var a = 1       //1. js预解析 找到var a = undefine ;接着找到function fn(){alert(a)};

function fn (){ //2. 逐行执行代码, 读带fn()时 调用函数, 进入局部作用域,找到var a = undefine;
alert(a);
var a = 2; //  此时弹出的a应是undefine;  继续往下执行代码  a = 1 是全局变量不受局部变量的影响;a=1
}

 fn();

 alert(a);


 // ------------------------------------------------------------------------------------




//   var a = 1       //1. js预解析 找到var a = undefine ;接着找到function fn(){alert(a)};


 function fn (){ //2. 逐行执行代码,a=1,读到fn()时调用函数,进入局部作用域,没找到var,又逐行执行代码,
  //  读到55行 alert(a)时;没找a,这时候会顺着作用域链,到父级作用域去找,找到a ,
alert(a); // 所以弹出的a是 1; 然后接着执行代码,a = 2(局部作用域,有能力修改全局变量),所以a=2
  a = 2; //  最后弹出的a是2 
 }


 fn();


 alert(a);


 //---------------------------------------------------------------------------------------




var a = 1       //1. js预解析 找到var a = undefine ;接着找到function fn(a){alert(a)};


 function fn (a){ //2. 逐行执行代码,a=1,读到fn()时调用函数,进入局部作用域,参数相当于var a,然后接着逐行执行代码,

  //   读到alert(a)时;找到a=undefine,所以弹出的是undefine,继续执行代码 a = 2,
alert(a); // 此时局部作用域中的a=2,函数调用完毕,接着继续往下执行代码
  a = 2 ;//    alert(a),此时a是全局作用域中的a,所以弹出来的a是1;
 }

fn();


alert(a);


 //-----------------------------------------------------------------------------------------


 var a = 1       //1. js预解析 找到var a = undefine ;接着找到function fn(a){alert(a)};


//  function fn (a){ //2. 逐行执行代码,a=1,读到fn(a)时调用函数,进入局部作用域,参数相当于     var a,
//此时fn(a)中的a来自全局变量,局部作用域中的a 相当于var a=1
alert(a); //   所以弹出的a是1;继续执行代码,a=2,局部作用域中a的值改为2;
a = 2;   // 1 // a = 2,此时局部作用域中的a=2,函数调用完毕,接着继续往下执行代码
  //alert(a),此时a是全局作用域中的a,所以弹出来的a是1;
 }

fn(a);
 alert(a);  // 1

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值