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 相关文章推荐
escape、encodeURI 和 encodeURIComponent 的区别
Mar 02 Javascript
动态样式类封装JS代码
Sep 02 Javascript
写自已的js类库需要的核心代码
Jul 16 Javascript
jQuery不使用插件及swf实现无刷新文件上传
Dec 08 Javascript
jquery实现的缩略图预览滑块实例
Jun 25 Javascript
JavaScript笔记之数据属性和存储器属性
Mar 31 Javascript
jQuery模拟实现天猫购物车动画效果实例代码
May 25 jQuery
Vue上传组件vue Simple Uploader的用法示例
Aug 25 Javascript
详解使用路由延迟加载 Angular 模块
Oct 12 Javascript
zTree 树插件实现全国五级地区点击后加载的示例
Feb 05 Javascript
小程序扫描普通链接二维码跳转小程序指定界面方法
May 07 Javascript
详解nginx配置vue h5 history去除#号
Nov 09 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 循环列出目录内容的函数代码
2010/05/26 PHP
php的大小写敏感问题整理
2011/12/29 PHP
PHP编程函数安全篇
2013/01/08 PHP
php+mysqli数据库连接的两种方式
2015/01/28 PHP
javascript 操作文件 实现方法小结
2009/07/02 Javascript
javascript中的继承实例代码
2011/04/27 Javascript
JavaScript高级程序设计(第3版)学习笔记9 js函数(下)
2012/10/11 Javascript
js禁止document element对象选中文本实现代码
2013/03/21 Javascript
js中点击空白区域时文本框与隐藏层的显示与影藏问题
2013/08/26 Javascript
IE8的JavaScript点击事件(onclick)不兼容的解决方法
2013/11/22 Javascript
jQuery中end()方法用法实例
2015/01/08 Javascript
JS生成和下载二维码的代码
2016/12/07 Javascript
js制作可以延时消失的菜单
2017/01/13 Javascript
vue.js全局API之nextTick全面解析
2017/07/07 Javascript
详解实现一个通用的“划词高亮”在线笔记功能
2019/04/23 Javascript
ElementUI Tag组件实现多标签生成的方法示例
2019/07/08 Javascript
微信小程序基于ColorUI构建皮皮虾短视频去水印组件
2020/11/04 Javascript
基于vue与element实现创建试卷相关功能(实例代码)
2020/12/07 Vue.js
详解python单例模式与metaclass
2016/01/15 Python
详解python 拆包可迭代数据如tuple, list
2017/12/29 Python
python kafka 多线程消费者&amp;手动提交实例
2019/12/21 Python
python shell命令行中import多层目录下的模块操作
2020/03/09 Python
flask项目集成swagger的方法
2020/12/09 Python
HTML5之SVG 2D入门11—用户交互性(动画)介绍及应用
2013/01/30 HTML / CSS
Vans奥地利官方网站:美国原创极限运动潮牌
2018/09/30 全球购物
美国手工艺品市场的领导者:Annie’s
2019/04/04 全球购物
英国奢华护肤、美容和Spa品牌:Temple Spa
2019/11/02 全球购物
一些Unix笔试题和面试题
2013/01/22 面试题
餐饮管理自我介绍信
2014/01/15 职场文书
考核工作实施方案
2014/03/30 职场文书
群教个人对照检查材料
2014/08/20 职场文书
学校党员对照检查材料
2014/08/28 职场文书
营业用房租赁协议书
2014/11/26 职场文书
2014年应急工作总结
2014/12/11 职场文书
2015年度服装销售工作总结
2015/03/31 职场文书
初中英语教学反思范文
2016/02/15 职场文书