js中作用域的实例解析


Posted in Javascript onMarch 16, 2017

首先,要了解一下作用域的概念:作用--读、写,域--范围或空间。作用域:可用来进行读、写操作的范围或者空间。

其次,再来看看浏览器读取js文件(script标签内的内容)的步骤。

第一步:预解析-----根据var function 把可能用到的参数或函数找出来,放在内存里(这相当于放到仓库里面)

例1:

<script>
alert(a)
var a=1
function fn1(){alert(2)}
</script>

根据var和function可以找到:a  fn1

预解析的过程中会自动给变量赋值undefined,即:a=undefined;而函数的值就函数本身,即:fn1=function fn1(){alert(2)}

所以预解析后:a = undefined, fn1=function fn1(){alert(2)}

如果函数和变量重名,那么只保留有值的那个。

例2:

<script>
alert(a)
var a=1
function a(){alert(2)}
var a=10
</script>

根据var和function可以找到:a  a  a

预解析的过程中:a=undefined, a=function a(){alert(2)}, a=undefined

预解析之后就只有 a=function a(){alert(2)}

例3:

如果例2中var a=10后面还有一个函数function a(){alert(4)}

那么预解析之后的结果就变成了:a=function a(){alert(4)}。因为后一个有值的会覆盖前一个。

第二步:就是从上而下逐行解读代码了

例4:

首先我们知道下面的代码预解析的结果是:a=function a(){alert(4)}

<script>
alert(a)                //读这一行的时候a=function a(){alert(4)},所以打印出来的是function a(){alert(4)}
var a=1                //读这一的行的是后,是给a重新赋值了,所以a=1
alert(a)                //读这一行的时候a=1,所以打印出来的是1
function a(){alert(2)}     //读这一行的时候,没有对a重新赋值,也不会打印任何东西,因为函数没被调用。
alert(a)               //读这一行的时候a=1,所以打印出来的是1
var a=10             //读这一的行的是后,是给a重新赋值了,所以a=10
alert(a)              //读这一行的时候a=10,所以打印出来的是10
function a(){alert(4)}    //读这一行的时候,没有对a重新赋值,也不会打印任何东西,因为函数没被调用。
alert(a)              //读这一行的时候a=10,所以打印出来的是10
</script>

---------------------上面的内容,帮助去理解预解析的概念,还没有用到“域”。而对于预解析来说,只要遇到一个“域”,就会在这个“域”内发生预解析------------------------

例5:

以下代码预解析:a=undefined,fn1=funciton fn1(){alert(a)var a=2;},然后开始执行代码

<script>
var a=1     //读到这一行的时,给a赋值,a=1
funciton fn1(){alert(a);var a=2;} //读到这一行的时,什么都没发生
fn1();//读到这一行时,函数被调用。也分为两步
       //1、函数被调用首先进行这个函数域的预解析,并把自己的预解析放在自己的仓库里面。
       //2、逐行解读代码:当读到alert(a)时,函数域的预解析结果为a=undefined,所以打印出undefined。读到var a=2时,将自己预解析的结果变为a=2.
alert(a);//读到这一行的时候a=1,打印出1
</script>

例6:在例5的基础上进行一个小改动,把var a=2改为a=2,则输出的结果又不同。

<script>
var a=1  //a=1
funciton fn1(){alert(a); a=2;}
fn1();  //在函数调用的时候。因为函数内部没有“var”,所以预解析没有结果。当执行函数中的alert(a),就会到函数外(父域)找a,此时a=1,所以打印出1
         //函数a=2,是给全局变量赋值,所以a=2
alert(a);//因为a=2,所以打印出2
</script>

例7:在例6基础上,改动一下

<script>
var a=1  
funciton fn1(a){alert(a); a=2;}
fn1();        
alert(a);
</script>

打印出的结果会是:undefined,1。大家自己思考吧。提示:funciton fn1(a)相当于funciton fn1(var a)

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
Jquery拖拽并简单保存的实现代码
Nov 28 Javascript
浅谈JavaScript编程语言的编码规范
Oct 21 Javascript
人人网javascript面试题 可以提前实现下
Jan 05 Javascript
浅谈JavaScript异常处理语句
Jun 26 Javascript
基于JQuery实现图片轮播效果(焦点图)
Feb 02 Javascript
基于Bootstrap仿淘宝分页控件实现代码
Nov 07 Javascript
javascript 利用arguments实现可变长参数
Nov 21 Javascript
JS实现的样式切换功能tableCSS实例
Dec 30 Javascript
JavaScript箭头函数_动力节点Java学院整理
Jun 28 Javascript
webpack2.0配置postcss-loader的方法
Aug 17 Javascript
Three.js实现绘制字体模型示例代码
Sep 26 Javascript
JS实现的杨辉三角【帕斯卡三角形】算法示例
Feb 26 Javascript
Vue.2.0.5过渡效果使用技巧
Mar 16 #Javascript
JS实现页面打印功能
Mar 16 #Javascript
Vue中添加过渡效果的方法
Mar 16 #Javascript
JavaScript实现简单精致的图片左右无缝滚动效果
Mar 16 #Javascript
js实现瀑布流效果(自动生成新的内容)
Mar 16 #Javascript
es6的数字处理的方法(5个)
Mar 16 #Javascript
Webpack打包慢问题的完美解决方法
Mar 16 #Javascript
You might like
用PHP实现文件上传二法
2006/10/09 PHP
深入PHP内存相关的功能特性详解
2013/06/08 PHP
PHP修改session_id示例代码
2014/01/08 PHP
PHP strtotime函数用法、实现原理和源码分析
2015/02/04 PHP
PHP扩展开发教程(总结)
2015/11/04 PHP
PHP实现查询手机归属地的方法详解
2017/04/28 PHP
php读取本地json文件的实例
2018/03/07 PHP
基于jquery的仿百度的鼠标移入图片抖动效果
2010/09/17 Javascript
jQuery 选择器项目实例分析及实现代码
2012/12/28 Javascript
js获取dom的高度和宽度(可见区域及部分等等)
2013/06/13 Javascript
基于OO的动画附加插件,可以实现弹跳、渐隐等动画效果 分享
2013/06/24 Javascript
基于JavaScript实现购物网站商品放大镜效果
2016/09/06 Javascript
jQuery tip提示插件(实例分享)
2017/04/28 jQuery
详解如何将angular-ui的图片轮播组件封装成一个指令
2017/05/09 Javascript
vue之nextTick全面解析
2017/05/17 Javascript
js实现图片上传预览原理分析
2017/07/13 Javascript
让bootstrap的carousel支持滑动滚屏的实现代码
2017/11/27 Javascript
Node.js使用supervisor进行开发中调试的方法
2019/03/26 Javascript
微信小程序学习笔记之获取位置信息操作图文详解
2019/03/29 Javascript
NodeJS读取分析Nginx错误日志的方法
2019/05/14 NodeJs
[02:20]DOTA2中文配音宣传片
2013/05/22 DOTA
[01:32:22]DOTA2-DPC中国联赛 正赛 Ehome vs VG BO3 第一场 2月5日
2021/03/11 DOTA
Python实现Pig Latin小游戏实例代码
2018/02/02 Python
Python爬虫框架Scrapy常用命令总结
2018/07/26 Python
浅谈numpy中np.array()与np.asarray的区别以及.tolist
2020/06/03 Python
python在地图上画比例的实例详解
2020/11/13 Python
python爬虫中抓取指数的实例讲解
2020/12/01 Python
一份软件工程师的面试试题
2016/02/01 面试题
化工专业推荐信范文
2013/11/28 职场文书
消防应急演练方案
2014/02/12 职场文书
演讲稿格式
2014/04/30 职场文书
教书育人演讲稿
2014/09/11 职场文书
大学生自我评价范文
2015/03/03 职场文书
《雪域豹影》读后感:父爱的伟大
2019/12/23 职场文书
Django项目如何获得SSL证书与配置HTTPS
2021/04/30 Python
MySQL学习之基础操作总结
2022/03/19 MySQL