JS全局与局部作用域解析、作用域链(下)
2021-04-25 08:28
标签:UNC 作用 页面 ash function 全局 bsp 作用域 结果 作用域: 域:空间、范围、区域…… 域分为:全局 一般在script标签范围内定义的变量、函数,我们习惯性地叫做全局变量、全局函数 一个script就是一个域,只要是一个域,就会发生:预解析、逐行解读代码 页面上可以写多个script 举个栗子1: alert(a); var a = 1; JS 会一块一块进行解析、执行,是单线程的 执行第一块时,会先在那个仓库找a;找不到a,就报错:a is not defined; 举个栗子2: var a = 1; alert(a); 域是自上而下执行的; 第一个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全局与局部作用域解析、作用域链(下) 标签:UNC 作用 页面 ash function 全局 bsp 作用域 结果 原文地址:https://www.cnblogs.com/tongguilin/p/12229891.html
文章标题:JS全局与局部作用域解析、作用域链(下)
文章链接:http://soscw.com/index.php/essay/79332.html