我们搞懂了作用域,才能更清楚的知道代码的执行顺序!
作用域:
// 域:空间、范围、区域……// 作用:读、写
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