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 相关文章推荐
用js 让图片在 div或dl里 居中,底部对齐
Jan 21 Javascript
JQuery for与each性能比较分析
May 14 Javascript
处理文本部分内容的TextRange对象应用实例
Jul 29 Javascript
推荐一个封装好的getElementsByClassName方法
Dec 02 Javascript
javascript版2048小游戏
Mar 18 Javascript
javascript实现的多个层切换效果通用函数实例
Jul 06 Javascript
HTML5 实现的一个俄罗斯方块实例代码
Sep 19 Javascript
js点击任意区域弹出层消失实现代码
Dec 27 Javascript
Javascript实现数组中的元素上下移动
Apr 28 Javascript
用Webpack构建Vue项目的实践
Nov 07 Javascript
微信小游戏中three.js离屏画布的示例代码
Oct 12 Javascript
JS精髓原型链继承及构造函数继承问题纠正
Jun 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的Yii框架中Model模型的学习教程
2016/03/29 PHP
php基于协程实现异步的方法分析
2019/07/17 PHP
JavaScript 关键字屏蔽实现函数
2009/08/02 Javascript
ExtJS Window 最小化的一种方法
2009/11/18 Javascript
使用jquery插件实现图片延迟加载技术详细说明
2011/03/12 Javascript
Javascript实现页面跳转的几种方式分享
2013/10/26 Javascript
JS复制内容到剪切板的实例代码(兼容IE与火狐)
2013/11/19 Javascript
让alert不出现弹窗的两种方法
2014/05/18 Javascript
JavaScript中的原型和继承详解(图文)
2014/07/18 Javascript
jQuery树形控件zTree使用小结
2016/08/02 Javascript
vue轮播图插件vue-awesome-swiper
2017/11/27 Javascript
JQuery模拟实现网页中自定义鼠标右键菜单功能
2018/11/14 jQuery
使用原生JS实现火锅点餐小程序(面向对象思想)
2019/12/10 Javascript
微信小程序实现自定义动画弹框/提示框的方法实例
2020/11/06 Javascript
js实现有趣的倒计时效果
2021/01/19 Javascript
[42:25]EG vs Spirit Supermajor 败者组 BO3 第二场 6.4
2018/06/05 DOTA
[05:26]TI10典藏宝瓶套装外观展示
2020/07/03 DOTA
Python translator使用实例
2008/09/06 Python
Python3实现将文件归档到zip文件及从zip文件中读取数据的方法
2015/05/22 Python
python学习教程之Numpy和Pandas的使用
2017/09/11 Python
详谈python在windows中的文件路径问题
2018/04/28 Python
pytorch + visdom 处理简单分类问题的示例
2018/06/04 Python
Python中捕获键盘的方式详解
2019/03/28 Python
Python GUI编程完整示例
2019/04/04 Python
使用python将多个excel文件合并到同一个文件的方法
2019/07/09 Python
python批量处理文件或文件夹
2020/07/28 Python
在keras中实现查看其训练loss值
2020/06/16 Python
HTML5的一个显示电池状态的API简介
2015/06/18 HTML / CSS
国际领先的在线时尚服装和配饰店:DressLily
2019/03/03 全球购物
JAVA中运算符的分类及举例
2015/09/12 面试题
销售人员自我评价怎么写
2013/09/19 职场文书
党的群众路线教育实践活动个人对照检查材料
2014/09/22 职场文书
中国汉字听写大会观后感
2015/06/02 职场文书
物业保洁员管理制度
2015/08/05 职场文书
详解redis分布式锁的这些坑
2021/05/19 Redis
基于Apache Hudi在Google云构建数据湖平台的思路详解
2022/04/07 Servers