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;

原文地址:https://www.cnblogs.com/tongguilin/p/12229891.html

时间: 2024-11-14 00:09:39

JS全局与局部作用域解析、作用域链(下)的相关文章

JS全局与局部作用域解析、作用域链(上)

讲解实例3: <script> alert(a); var a = 1; alert(a); function a(){alert(2);} alert(a); var a =3; alert(a); function a(){alert(4);} alert(a); a(); </script> 结果看得出来吗? 揭晓结果,依次是: function a(){alert(4);} 1 1 3 3 报错:a is not a function 详解: 预解析阶段:根据var fun

JavaScript作用域问题:预解析、全局与局部作用域解析、作用域链

要想了解JS作用域问题,就要先了解浏览器的JS解析器的工作方式,当浏览器读到script脚本代码时,JS解析器便开始工作.其工作步骤主要分为两部分: JS解析器: 1.“找一些东西”(预解析):var function 参数 例: alert(a); //undefined var a=1; alert(a); //1 function fn1(){alert(2);} JS解析器会先找到var function 参数进行预解析. 找到var定义的变量a时,解析为a = 未定义,不会读取具体值.

js的执行环境和作用域链

执行环境 js的执行环境就是:定义了变量或函数有权访问的其他数据,决定了它们各自的行为.每个环境都有一个与之相关联的对象,环境中定义的变量和函数都保存在这个对象中. 全局变量就是最外围的环境,通常被认为是window对象.全局变量和局部变量会在环境栈中,当执行环境在执行完环境中的所有代码后会销毁,环境栈会将该栈弹出,定义的变量与函数也会被销毁,而全局变量会在程序退出后销毁. 作用域链 作用域是保证对执行环境有权访问  的所有变量  的有序访问. 链的形成: 作用域链的前端是当前执行环境的变量对象

JS高级 -- 执行上下文与作用域链

这个问题涉及到三个点: 1. 执行上下文 2. 函数嵌套导致的执行上下文栈 3.闭包 1 <script> 2 var a = 1; 3 var f1 = function(){//第一个函数 4 var a = 2; 5 var b = 1; 6 7 var f2 = function(){//第二个函数 8 var c = 1; 9 var f3 = function(){//第三个函数 //第三个函数执行,他自己的执行上下文中没有a,b,c,则从父级函数f2的执行上下文中去找,f2中有c

js全局变量与局部变量 预解析与作用域链详解

局部变量和全局变量同名时,会隐藏这个全局变量: 4.变量 关键字: 4.变量 4.1 变量的类型 JS是松散类型的语言 4.2 变量的声明 var 声明是变量的标准声明 var 声明的变量是永久性的,不能用delete运算符删除 全局对象,调用对象初始化时,JS解析器会在相应的代码段里寻找var声明的变量, 然后在全局对象,调用对象中创建相应的属性,此时它是未赋值的(undefined), 当程序执行到相应的var声明代码段时才会给相应对象的属性赋值 重复的声明:根据以上var声明作用的理解,重

深入理解作用域链

作用域链是JavaScript中的一个非常重要的概念,想要理解什么是作用域链,就必须知道什么是作用域. 作用域: 1.全局作用域: (1)最外层函数和在最外层函数定义的变量,拥有全局的作用域.js中一切皆对象,函数也是对象,js最外层的对象是window.所以在window下定义的函数和未被这些函数包裹的变量,就拥有全局作用域,这些变量能够在其他任何作用域下使用. (2)所有window对象下的内置属性属于全局变量:如window.document,window.navigator等. (3)没

标识符解析、作用域链、运行期上下文、原型链、闭包

本文讲到的是如何从数据访问层面上提高JS 代码的执行效率.总的来讲有以下几条原则: 函数中读写局部变量总是最快的,而全局变量的读取则是最慢的: 尽可能地少用with 语句,因为它会增加with 语句以外的数据的访问代价: 闭包尽管强大,但不可滥用,否则会影响到执行速度以及内存: 嵌套的对象成员会明显影响性能,尽量少用: 避免多次访问对象成员或函数中的全局变量,尽量将它们赋值给局部变量以缓存. 这么几句话看似简单,但要深刻理解其中的道理则需涉及到JS的 标识符解析.作用域链.运行期上下文(又称为执

执行环境,作用域,作用域链详解

声明:该文章有些概念摘自<JavaScript高级程序设计> 1.执行环境:也称"环境",执行环境定义了变量或函数有权访问的其他数据,决定了他们各自的行为.(全局定义的变量,函数里面可以访问.一般情况下,函数里面定义的变量,全局无法访问). 2.全局执行环境:全局执行环境是最外围的一直执行环境,(在web浏览器中,全局执行环境被认为是window对象,因此所有全局变量和函数都是作为window对象的属性和和方法创建的),全局环境直到应用程序退出(关闭网页或者刷新网页)才会被

【转】javascript 作用域链

JavaScript函数的作用域链分为定义时作用域链和运行时作用域链: 函数被定义的时候,它有一个属性[[scope]]标明它的定义作用域链,定义时作用域链[[scope]]遵守这样的规则:一个函数的定义时作用域链[[scope]]总是它所在的外部函数的执行时作用域链: 全局函数的定义作用域链只包含window的属性: 一个函数的执行时作用域链总是在定义时作用域链的头部压入当前活动对象(它包含this,arguments,参数,局部变量): 函数执行时,变量寻址总是从作用域链的顶端朝下寻找:所以