JS全局与局部感化域解析、感化域链(下)
域:空间、范畴、区域……
域分为:全局
一般在script标签范畴内界说的变量、函数,我们习惯性地叫做全局变量、全局函数
一个script就是一个域,只要是一个域,就会产生:预解析、逐行解读代码
页面上可以写多个script
举个栗子1:
<script>
alert(a);
</script>
<script>
var a = 1;
</script>
JS 会一块一块进行解析、执行,是单线程的
执行第一块时,会先在阿谁货仓找a;找不到a,就报错:a is not defined;
举个栗子2:
<script>
var a = 1;
</script>
<script>
alert(a);
</script>
域是自上而下执行的;
第一个script阿谁域执行完毕之后,货仓里面依然有:a = 1;
进而执行第二块script的域的时候,就可以弹出:1
【所以,当引入别人写的对象的时候,,一般都在开头的处所进行引用】
除了script这种全局的,还有函数、{} ……这种域,只要是域,就会产生预解析、逐行解读代码
举个栗子2-1:
var a = 1;
function fn1(){
alert(a);
var a = 2;
}
fn1();
alert(a);
预解析:
a = undefined;
fn1 = function fn1(){
alert(a);
var a = 2;
}
逐行解读代码:
a= 1;// 表达式,可以改削货仓里面的值;
fn1();//函数挪用:函数也是一个域,局部的域
预解析:a = undefined;
逐行执行:
alert(a); 弹出undefined; 【注意:函数里面的a是局部变量,与前面阿谁全局变量的a没有任何关系】
然后继续执行表达式(局部变量) a = 2;
完了,就进行垃圾回收机制之类的……以后再说
然后,继续接着执行alert(a);// 此处a访谒的是全局变量a,a = 1; 弹出:1
举个栗子2-2:
var a = 1;
function fn1(){
alert(a);
a = 2;
}
fn1();
alert(a);
功效:1,2
预解析:
a = undefined;
fn1 = function fn1(){
alert(a);
a = 2;
}
逐行执行:
表达式a = 1; //改削货仓的值为 a= 1;
函数声明// 什么也不会转变
函数挪用//fn1();
预解析:没有关键词var,那么,货仓里面就什么都没有
逐行解读代码:
alert(a);// 函数这个感化域里面没有找到a,那么解析器就会顺着这个感化域跳到它的上一层感化域去找
【从子集感化域访谒到父级感化域的过程,叫做感化域链——由里往外进行访谒;】
在父级里找到a;那么就弹出:1
继续执行 a = 2;//继续在货仓里找a,找不到,就顺着感化域链去上层找,找到外面的“a=1” 这个a, 然后,“a= 2”是表达式,于是就变动“a= 1” 为"a=2" 【也就是说,局部有能力去改外面的值】
然后,继续执行alert(a);//此时全局变量a的值已经被改为2,因此,弹出:2;
举个栗子2-3:
var a = 1;
function fn1(a){
alert(a);
a = 2;
}
fn1();
alert(a);
功效:undefined, 1
预解析:
a = undefined;
fn1 = function fn1(a){
alert(a);
a = 2;
}
逐行执行:
表达式a = 1; //改削货仓的值为 a= 1;
函数声明// 什么也不会转变
函数挪用//fn1();
预解析:没有关键词var,但是有形参a,形参a素质上就是一个局部变量 var a;所以这里货仓里面放入:a = undefined
逐行解读代码:
alert(a);// a = undefined
继续执行表达式 a = 2;//继续在货仓里找a,找到"a=undefined",就把a的值改为"a=2"
【在此过程中,全局变量a没有转变过】
然后,继续执行alert(a);//全局变量a的值依然为1,因此,弹出:1;
JS全局与局部感化域解析、感化域链(下)
温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/31088.html