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 textarea光标定位方法(兼容IE和FF)
Mar 12 Javascript
一个JavaScript函数把URL参数解析成Json对象
Sep 24 Javascript
常用的JavaScript WEB操作方法分享
Feb 28 Javascript
JS实现漂亮的窗口拖拽效果(可改变大小、最大化、最小化、关闭)
Oct 10 Javascript
JS在onclientclick里如何控制onclick的执行
May 30 Javascript
angular.js指令中transclude选项及ng-transclude指令详解
May 24 Javascript
详解利用 Vue.js 实现前后端分离的RBAC角色权限管理
Sep 15 Javascript
详解Vue快速零配置的打包工具——parcel
Jan 16 Javascript
js和jQuery以及easyui实现对下拉框的指定赋值方法
Jan 23 jQuery
利用vue和element-ui设置表格内容分页的实例
Mar 02 Javascript
Vue仿支付宝支付功能
May 25 Javascript
微信小程序顶部导航栏滑动tab效果
Jan 28 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
Discuz 模板引擎的封装类代码
2008/07/18 PHP
php+mysqli数据库连接的两种方式
2015/01/28 PHP
php基于双向循环队列实现历史记录的前进后退等功能
2015/08/08 PHP
PHP实现对xml进行简单的增删改查(CRUD)操作示例
2017/05/19 PHP
JavaScript通过RegExp实现客户端验证处理程序
2013/05/07 Javascript
使用JavaScript的AngularJS库编写hello world的方法
2015/06/23 Javascript
js实现简易的单数字随机抽奖(0-9)
2020/03/19 Javascript
Jquery ajax基础教程
2015/11/20 Javascript
Angular动态添加、删除输入框并计算值实例代码
2017/03/29 Javascript
label+input实现按钮开关切换效果的实例
2017/08/16 Javascript
浅谈Vue render函数在ElementUi中的应用
2018/09/06 Javascript
在Vue中使用axios请求拦截的实现方法
2018/10/25 Javascript
JS实现获取数组中最大值或最小值功能示例
2019/03/02 Javascript
微信小程序全局变量的设置、使用、修改过程解析
2019/09/24 Javascript
ES6 class类链式继承,实例化及react super(props)原理详解
2020/02/15 Javascript
Vue如何循环提取对象数组中的值
2020/11/18 Vue.js
[07:47]DOTA2国际邀请赛采访专栏:探访Valve总部
2013/08/08 DOTA
解决python爬虫中有中文的url问题
2018/05/11 Python
使用python将大量数据导出到Excel中的小技巧分享
2018/06/14 Python
使用IDLE的Python shell窗口实例详解
2019/11/19 Python
Python udp网络程序实现发送、接收数据功能示例
2019/12/09 Python
Python sklearn库实现PCA教程(以鸢尾花分类为例)
2020/02/24 Python
canvas之自定义头像功能实现代码示例
2017/09/29 HTML / CSS
布里斯班女装时尚品牌:Adrift
2017/12/28 全球购物
澳大利亚在线家具店:Luxo Living
2019/03/24 全球购物
Travelstart沙特阿拉伯:廉价航班、豪华酒店和实惠的汽车租赁优惠
2019/04/06 全球购物
英国家具、照明、家居用品网上商店:Wayfair.co.uk
2020/02/13 全球购物
销售人员求职的自我评价分享
2014/03/15 职场文书
年会搞笑主持词串词
2014/03/24 职场文书
运动会口号8字
2014/06/07 职场文书
幼儿教师师德师风自我剖析材料
2014/09/29 职场文书
2014年网络管理员工作总结
2014/12/01 职场文书
学校会议通知范文
2015/04/15 职场文书
六一活动主持词
2015/06/30 职场文书
公司客户答谢酒会祝酒词
2015/08/11 职场文书
参观监狱警示教育心得体会
2016/01/15 职场文书