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

看到了三题经典题型,就我目前的认识对此题进行总结。如有错误,敬请指正

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

js引擎工作分为两步:

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

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

查询的方式有两种:

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

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

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

第一题:

 var a = 10;
function test(){
  a = 100;
  alert(a);
  alert(this.a);
  var a;
  alert(a);
}
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。

第二题:

 var a = 100;
function test(){
alert(a);
var a = 10;
alert(a);
}
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。

第三题:

 var a = 100;
function test(){
alert(a);
a = 10;
alert(a);
}
test();
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。

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

  1. python3 函数传参练习 全局变量与局部变量 的理解

    额 还是继续抄一边NLP第二条: 2.一个人不能控制另外一个人   一个人不能改变另外一个人,一个人只能改变自己. 每个人的信念,价值观,规条系统只对本人有效,不应强求别人接守. 改变自己,别人才会有 ...

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

    > [带var] > 在当前作用于中声明了一个变量,如果当前是全局作用域,也相当于给全局作用域设置了一个属性叫做a ```javascript //=>变量提升:var a; < ...

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

    今天看到大神写得一片文章,自己对全局变量和局部变量的理解还是不够深刻,因此写到这篇文章,做个总结. 大神代码截图+理解文字如下: 解析:上面代码中,变量i是var命令声明的,在全局范围内都有效,所以全 ...

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

    “JavaScript设计得最出色的就是它的函数的实现.” -- <JavaScript语言精粹> 函数包含一组语句,它们是JS的基础模块单元,用于指定对象的行为.一般来说,所谓编程,就是 ...

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

    原文链接:http://blog.csdn.net/zyz511919766/article/details/7276089# 今天公司一个实习小妹子问我两段JS代码的区别: <script t ...

  6. JS全局变量与局部变量

    一句话概括:在函数外声明的变量都为全局变量,在函数内声明的为局部变量. 一.局部变量和全局变量重名会覆盖全局变量 var a = 1; function test1() { var a = 2; al ...

  7. PHP和JS中全局变量和局部变量

    一,PHP中全局变量和局部变量 php与C++中对全局变量和局部变量定义类似,全局变量:函数外定义的变量,在全局通用:局部变量:在函数内定义的变量,只在函数内有效.PHP中变量范围跨越了include ...

  8. 对js中局部变量、全局变量和闭包的理解

    对js中局部变量.全局变量和闭包的理解 局部变量 对于局部变量,js给出的定义是这样的:在 JavaScript函数内部声明的变量(使用 var)是局部变量,所以只能在函数内部访问它.(该变量的作用域 ...

  9. js中全局变量和局部变量以及变量声明提升

    javascript中全局变量和局部变量的区别 转载前端小99 发布于2018-04-23 15:31:35 阅读数 2102  收藏 展开 [javascript] view plain copy ...

随机推荐

  1. C#编写windows服务,多服务为什么只启动一个(ServiceBase.Run)

    https://zhidao.baidu.com/question/380395667.html //多服务一个宿主程序时必须注间以下要点: Service1的ServiceName 必须 Insta ...

  2. jQuery.data() 使用方法

    data() 方法向被选元素附加数据,或者从被选元素获取数据.在实际开发中,可以用来记录上一步操作某一对象的值,来给下一步操作做一些判断 $("#btn1").click(func ...

  3. 【JavaScript吉光片羽】--- 滑动条

    灯光的亮度控制需要一个滑动条,先借用lamp源码中Bar: var Bar = function (opt) { var defaults = { $id: "", // 进度条d ...

  4. 如何使用yum 下载 一个 package ?如何使用 yum install package 但是保留 rpm 格式的 package ? 或者又 如何通过yum 中已经安装的package 导出它,即yum导出rpm?

    注意 RHEL5 和 RHEL6 的不同 How to use yum to download a package without installing it Solution Verified - ...

  5. CI Weekly #5 | 微服务架构下的持续部署与交付

    CI Weekly 围绕『 软件工程效率提升』 进行一系列技术内容分享,包括国内外持续集成.持续交付,持续部署.自动化测试. DevOps 等实践教程.工具与资源,以及一些工程师文化相关的程序员 Ti ...

  6. Boostrap入门(一)

    1.第一步:下载Boostrap有关文件 Boostrap中文网:http://www.bootcss.com/ -->--> 2.第二步: 如下代码:引入相关文件即可. <!DOC ...

  7. ASP.NET MVC5+EF6+EasyUI 后台管理系统(2)-easyui构建前端页面框架[附源码]

    系列目录 前言 为了符合后面更新后的重构系统,本文于2016-10-31日修正一些截图,文字 我们有了一系列的解决方案,我们将动手搭建新系统吧. 后台系统没有多大的UI视觉,这次我们采用的是标准的左右 ...

  8. 表单reset无法重置hidden的解决方案

    方法一:用text代替hidden,设置text隐藏 <input id="id" name="id" style="display: none ...

  9. EasyUI中那些不容易被发现的坑——EasyUI重复请求2次的问题

    问题控件:datagrid.combobox.所有能设置url属性的控件 问题版本:1.4.4.1.4.5(之前的版本没测) 问题如图: 重复请求2次,错误代码如图: 错误问题分析:html加载的时候 ...

  10. Oracle架构设计01:表空间的管理维护规范

    Oracle数据库的表空间管理可以说是非常简单和基础的一项维护工作,但是越简单的事情就越要制定统一的规范,这样数据库的各项管理工作才会愈加的简单高效. 那么接下来,问题来了.. Q1:当我们接手一个新 ...