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 相关文章推荐
在JavaScript中typeof的用途介绍
Apr 11 Javascript
JavaScript地图拖动功能SpryMap的简单实现
Jul 17 Javascript
你可能不知道的JavaScript的new Function()方法
Apr 17 Javascript
javascript中的nextSibling使用陷(da)阱(keng)
May 05 Javascript
javascript实现节点(div)名称编辑
Dec 17 Javascript
jQuery中contents()方法用法实例
Jan 08 Javascript
JS基于Mootools实现的个性菜单效果代码
Oct 21 Javascript
如何获取元素的最终background-color
Feb 06 Javascript
js html实现计算器功能
Nov 13 Javascript
详解Vue-cli3 项目在安卓低版本系统和IE上白屏问题解决
Apr 14 Javascript
JavaScript工具库之Lodash详解
Jun 15 Javascript
ES11屡试不爽的新特性,你用上了几个
Oct 21 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
咖啡因含量是由谁决定的?低因咖啡怎么来?低因咖啡适合什么人喝
2021/03/06 新手入门
PHP自定义大小验证码的方法详解
2013/06/07 PHP
PHP stripos()函数及注意事项的分析
2013/06/08 PHP
使用PHP计算两个路径的相对路径
2013/06/14 PHP
PHP实现留言板功能的详细代码
2017/03/25 PHP
如何在PHP环境中使用ProtoBuf数据格式
2020/06/19 PHP
javascript 写类方式之七
2009/07/05 Javascript
jQuery Ajax方法调用 Asp.Net WebService 的详细实例代码
2011/04/27 Javascript
php析构函数的具体用法小结
2014/03/11 Javascript
js实现的标题栏新消息闪烁提示效果
2014/06/06 Javascript
cocos2dx骨骼动画Armature源码剖析(一)
2015/09/08 Javascript
javascript特殊日历控件分享
2016/03/07 Javascript
javascript HTML5文件上传FileReader API
2020/03/27 Javascript
判断是否存在子节点的实现代码
2016/05/18 Javascript
深入理解javascript中的 “this”
2017/01/17 Javascript
详解vue2 $watch要注意的问题
2017/09/08 Javascript
详解使用python crontab设置linux定时任务
2016/12/08 Python
Python实现快速计算词频功能示例
2018/06/25 Python
Python Web编程之WSGI协议简介
2018/07/18 Python
python实现图片九宫格分割
2021/03/07 Python
解决更改AUTH_USER_MODEL后出现的问题
2020/05/14 Python
Tensorflow卷积实现原理+手写python代码实现卷积教程
2020/05/22 Python
Pycharm Available Package无法显示/安装包的问题Error Loading Package List解决
2020/09/18 Python
python tqdm实现进度条的示例代码
2020/11/10 Python
matplotlib部件之套索Lasso的使用
2021/02/24 Python
CSS3的column-fill属性对齐列内容高度的用法详解
2016/07/01 HTML / CSS
ET Mall东森购物网:东森严选
2017/03/06 全球购物
工程负责人任命书
2014/06/06 职场文书
奥林匹克运动会口号
2014/06/19 职场文书
中秋节国旗下演讲稿
2014/09/05 职场文书
有限公司股东合作协议书
2014/10/29 职场文书
2014年个人年终总结
2015/03/09 职场文书
2015年资料员工作总结
2015/04/25 职场文书
大学班干部竞选稿
2015/11/20 职场文书
2016优秀员工先进事迹材料
2016/02/25 职场文书
关于python pygame游戏进行声音添加的技巧
2021/10/24 Python