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 相关文章推荐
document.all与WEB标准
May 13 Javascript
利用js的Node遍历找到repeater的一个字段实例介绍
Apr 25 Javascript
Javascript中各种trim的实现详细解析
Dec 10 Javascript
如何使用HTML5地理位置定位功能
Apr 27 Javascript
javascript比较两个日期相差天数的方法
Jul 23 Javascript
javascript实现简单的分页特效
Aug 12 Javascript
基于jquery步骤进度条源码分享
Nov 12 Javascript
js表单中选择框值的获取及表单的序列化
Dec 17 Javascript
AngularJS  双向数据绑定详解简单实例
Oct 20 Javascript
jquery编写日期选择器
Mar 16 Javascript
微信小程序开发之toast等弹框提示使用教程
Jun 08 Javascript
微信小程序注册60s倒计时功能 使用JS实现注册60s倒计时功能
Aug 16 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制作简单的内容采集器的代码
2007/11/28 PHP
Laravel中使用自己编写类库的3种方法
2015/02/10 PHP
PHP使用in_array函数检查数组中是否存在某个值
2015/03/25 PHP
使用prototype.js 的时候应该特别注意的几个问题.
2007/04/12 Javascript
Prototype 工具函数 学习
2009/07/23 Javascript
csdn 博客中实现运行代码功能实现
2009/08/29 Javascript
Jquery 获得服务器控件值的方法小结
2010/05/11 Javascript
自动最大化窗口的Javascript代码
2013/05/22 Javascript
javascript实现选中复选框后相关输入框变灰不可用的方法
2015/08/11 Javascript
JS面试题---关于算法台阶的问题
2016/07/26 Javascript
JavaScript仿聊天室聊天记录
2016/12/27 Javascript
Zepto实现密码的隐藏/显示
2017/04/07 Javascript
vue mint-ui学习笔记之picker的使用
2017/10/11 Javascript
webpack-dev-server远程访问配置方法
2018/02/22 Javascript
JS匿名函数和匿名自执行函数概念与用法分析
2018/03/16 Javascript
微信小程序实现左滑动删除效果
2020/03/30 Javascript
简单的编程0基础下Python入门指引
2015/04/01 Python
Python实现处理管道的方法
2015/06/04 Python
python实现数值积分的Simpson方法实例分析
2015/06/05 Python
深入理解Python中字典的键的使用
2015/08/19 Python
Python制作词云的方法
2018/01/03 Python
python实现微信每日一句自动发送给喜欢的人
2019/04/29 Python
Python交互式图形编程的实现
2019/07/25 Python
解决Djang2.0.1中的reverse导入失败的问题
2019/08/16 Python
Python 网络编程之TCP客户端/服务端功能示例【基于socket套接字】
2019/10/12 Python
pycharm安装及如何导入numpy
2020/04/03 Python
Python自动化之UnitTest框架实战记录
2020/09/08 Python
pytorch加载语音类自定义数据集的方法教程
2020/11/10 Python
Melijoe美国官网:法国奢侈童装购物网站
2017/04/19 全球购物
为什么要做架构设计
2015/07/08 面试题
2014端午节活动策划方案
2014/01/27 职场文书
户外活动策划方案
2014/03/12 职场文书
《她是我的朋友》教学反思
2014/04/26 职场文书
促销活动总结范文
2014/04/30 职场文书
建筑工程技术专业求职信
2014/07/16 职场文书
Redis Cluster 字段模糊匹配及删除
2021/05/27 Redis