针对JS经典题型对全局变量及局部变量的理解浅谈

第一次写博,还蛮激动。。。

看到了三题经典题型,经老师讲解后,对此类题目有了更深刻的认识

就我目前的认识对此题进行总结。如有错误,敬请指正

首先,我们先明确一下JS引擎的工作步骤:

js引擎工作分为两步:

1.将这个js中的变量和函数声明保存到当前(注意,是当前)执行环境的变量对象中

2.再逐行解析执行js。当看到一个函数或一个变量时,js引擎就会去查询 这个函数或变量是在哪里定义的

查询的方式有两种:

a.按作用域链查找:先在当前执行环境查询这个变量或程序,如果没有,就到父执行环境 中查找,还没有就继续向上查找,一直到window

b.从对象中查找:如果一个函数是用对象来调用的,就可以从这个对象中查找,如果 在执行环境中没有找到,会报错,如果在对象中没有找到,会返回undefined

照我个人的理解:每一个函数都是一个独立的执行环境,在每一个执行环境中,都有两个工作步骤,也就是1和2,下面就题目分析

第一题:

1 var a = 10;
2 function test(){
3   a = 100;
4   alert(a);
5   alert(this.a);
6   var a;
7   alert(a);
8 }
9 test();

答案:100 10 100

就代码解析:函数的工作域是window,首先进行第1步:将变量和函数声明保存到当前执行环境的变量对象中,个人对此句话的理解是:引擎工作的第一步是将变量和函数的声明提前,相当于:

var a;
var test;

之后开始第2步:逐行解析执行js,首先将10赋值给a,然后跳过没有自执行的test函数,开始第9句,第9句是一句对test()函数调用,执行环境要注意是window,因此,test函数中的this指向的必然是window。进入test函数内部,与开始时的步骤相同,第一步,将变量及函数声明提前至解析函数之前,即:

var a;

之后开始对函数内代码逐条执行,首先将100赋值给a,则此时,a 结果为100;而this指的是调用此函数的对象,由第9句,由上述的分析知this指的是window,因此this.a 指的是window中的变量a,其值为10,因此第5句结果为10;第六句在test解析时就被提前了,所以可直接跳到第7句,此时的a指向的还是函数内部的变量a,因此结果为100。

第二题:

1 var a = 100;
2 function test(){
3     alert(a);
4     var a = 10;
5     alert(a);
6 }
7 test();

答案:undefined 10

就代码解析:函数的工作域是window,依旧是进行第1步:

var a;
var test;

之后进行逐行解析,第1行将100赋值给a,第7行调用此函数,在被调用的函数test()内,首先有

var a;

第2步,逐行解析,a在其执行环境中已经被定义,所以不会有是全局变量的可能,但因第一步只是把变量声明提前,而非将其赋值,因此在第3句中,a是一个声明但未初始化的值,因此其结果为undefined。第4句将10赋值给a,因此第5句结果为10。

第三题:

1 var a = 100;
2 function test(){
3     alert(a);
4     a = 10;
5     alert(a);
6 }
7 test();
8 alert(a);

答案:100 10 10

就代码解析:函数的工作域是window,依旧是进行第1步:

var a;
var test;

逐行解析:第1行将100赋值给a,第7行调用此函数,在被调用的函数test()内,第一遍并没有变量声明或函数声明,因此进入第2步,依旧是逐行解析,第3行,a在其执行环境中并无声明,由开头介绍的js引擎的第2步a中介绍,先在当前执行环境查询这个变量或程序,如果没有,就到父执行环境 中查找,还没有就继续向上查找,一直到window。因此a在test中并非局部变量,而是window的全局变量,即a的结果是100;第4行中,全局变量a的值修改为10,因此第5行结果为10;在函数结束后,全局变量a的值已经被修改为10,因此第8行结果为10。

时间: 2025-01-02 18:45:51

针对JS经典题型对全局变量及局部变量的理解浅谈的相关文章

python 函数传参练习 全局变量与局部变量 的理解

额 还是继续抄一边NLP第二条: 2.一个人不能控制另外一个人   一个人不能改变另外一个人,一个人只能改变自己. 每个人的信念,价值观,规条系统只对本人有效,不应强求别人接守. 改变自己,别人才会有可能改变. 一个人不能推动另外一个人,每个人都只可以自己推动自己. 找出对方的价值观,创造,增大或转移对方在乎的价值,对方便会产生推动自己的行为. 一个人因此不能“教导”另外一个人,一个人只能引导另外一个人取学习. 因此一个人不能希望另外一个人放弃自己的一套信念,价值观和规条系统,而去接受另外的一套

js基础第一天 (全局变量,局部变量)

前言:今天我把变量这块内容单独放出来,是我觉的这也是个重点,我很早就知道变量这个东东,可惜一直半懂不懂的,每次出现复杂的写法我就蒙圈了,今天我利用的好长时间把这块内容弄明白. 初学者可以看看我下面的案例和详细解释,你们一定会恍然大悟,我今天就是这样的感觉.虽然每天进度很慢,但是每天都有收获,这就是积累成多. 现在感觉每天的时间不够用,时间过的超快.今天过的都不知道是星期几了. 声明全局变量 1.最外层执行环境下声明的变量是全局变量 2.不用var声明的变量是全局变量 全局变量特点:任何作用域下都

js作用域链以及全局变量和局部变量

> [带var] > 在当前作用于中声明了一个变量,如果当前是全局作用域,也相当于给全局作用域设置了一个属性叫做a ```javascript //=>变量提升:var a; <=>window.a=undefined; console.log(a);//undefined var a = 12; console.log(a);//12 console.log(window.a);//window['a']在'全局作用域'中,我们声明了一个变量,相当于全局对象window增加

全局变量和局部变量的理解

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static string mm; static void Write() { string mm = "大家好,我是方法!"; Console.WriteLine("现在我在方法Write()里面!"

关于全局变量和局部变量的理解

1 ,函数内部声明变量是函数自己的局部变量,函数外部声明变量是全局变量, 如果函数内没有声明局部变量,将返回全局变量,如果函数内部声明有局部变量, 将返回局部变量: 2,如下图,函数内声明有color= red,返回red; 2,下图没有声明局部变量,返回blue: 3,传递参数:ECMA中所有参数的传递都是按值传递:参数只能按值传递: 参数实际上是函数的局部变量;调用这个函数时,变量count作为参数传入函数中, count的值为20,数值20便复制给num使用,就是按值传递:如下: 在函数内

JavaScript中全局变量和局部变量的不同

今天看到大神写得一片文章,自己对全局变量和局部变量的理解还是不够深刻,因此写到这篇文章,做个总结. 大神代码截图+理解文字如下: 解析:上面代码中,变量i是var命令声明的,在全局范围内都有效,所以全局只有一个变量i.每一次循环,变量i的值都会发生改变,而循环内被赋给数组a的函数内部的console.log(i),里面的i指向的就是全局的i.也就是说,所有数组a的成员里面的i,指向的都是同一个i,导致运行时输出的是最后一轮的i的值,也就是10. 一.定义 局部变量:变量在函数内声明,只能在函数内

JS函数 -- 功能,语法,返回值,匿名函数,自调用匿名函数,全局变量与局部变量,arguments的使用

“JavaScript设计得最出色的就是它的函数的实现.” -- <JavaScript语言精粹> 函数包含一组语句,它们是JS的基础模块单元,用于指定对象的行为.一般来说,所谓编程,就是将一组需求分解成一组函数与数据结构的技能. 1.函数的功能 代码重复性使用 模块化编程 2.语法: 使用函数前要先定义才能使用 函数定义有三个部分:函数名,参数列表,函数体 格式: 1 function 函数名([参数1, 参数2, ...]){ 2 3 函数执行部分; 4 5 return 表达式; 6 7

Javascript:谈谈JS的全局变量跟局部变量

原文链接:http://blog.csdn.net/zyz511919766/article/details/7276089# 今天公司一个实习小妹子问我两段JS代码的区别: [javascript] view plain copy <script type="text/javascript"> var a = "Hello"; function test(){ var a; alert(a); a = "World"; alert(

Javascript:谈谈JS的全局变量跟局部变量【转】

两段JS代码的区别:   <script type="text/javascript"> var a = "Hello"; function test(){ var a; alert(a); a = "World"; alert(a); } </script> <script type="text/javascript"> var a = "Hello"; functio