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 相关文章推荐
Prototype1.6 JS 官方下载地址
Nov 30 Javascript
Prototype String对象 学习
Jul 19 Javascript
JS焦点图切换,上下翻转
May 12 Javascript
火狐4、谷歌12不支持Jquery Validator的解决方法分享
Jun 20 Javascript
跨浏览器通用、可重用的选项卡tab切换js代码
Sep 20 Javascript
JS JQUERY实现滚动条自动滚到底的方法
Jan 09 Javascript
Javascript模仿淘宝信用评价实例(附源码)
Nov 26 Javascript
Node.js开发者必须了解的4个JS要点
Feb 21 Javascript
Node.js中使用jQuery的做法
Aug 17 Javascript
解决html input验证只能输入数字,不能输入其他的问题
Jul 21 Javascript
node.js中路由,中间件,ge请求和post请求的参数详解
Dec 26 Javascript
微信小程序实现自动定位功能
Oct 31 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 开发环境配置(Zend Studio)
2010/04/28 PHP
paypal即时到账php实现代码
2010/11/28 PHP
php中__destruct与register_shutdown_function执行的先后顺序问题
2014/10/17 PHP
php常用图片处理类
2016/03/16 PHP
浅谈Coreseek、Sphinx-for-chinaese、Sphinx+Scws的区别
2016/12/15 PHP
PHP使用 Imagick 扩展实现图片合成,圆角处理功能示例
2019/09/09 PHP
用javascript实现点击链接弹出&quot;图片另存为&quot;而不是直接打开
2007/08/15 Javascript
一些主流JS框架中DOMReady事件的实现小结
2011/02/12 Javascript
Jquery之Ajax运用 学习运用篇
2011/09/26 Javascript
理解javascript中的回调函数(callback)
2014/09/02 Javascript
jQuery中clearQueue()方法用法实例
2014/12/29 Javascript
javascript学习笔记整理(概述、变量、数据类型简介)
2015/10/25 Javascript
用自定义图片代替原生checkbox实现全选,删除以及提交的方法
2016/10/18 Javascript
基于JS实现仿百度百家主页的轮播图效果
2017/03/06 Javascript
详解微信第三方小程序代开发
2017/06/23 Javascript
jquery 键盘事件的使用方法详解
2017/09/13 jQuery
C#程序员入门学习微信小程序的笔记
2019/03/05 Javascript
简单了解JavaScript中的执行上下文和堆栈
2019/06/24 Javascript
使用axios请求时,发送formData请求的示例
2019/10/29 Javascript
Vue父子传递实例讲解
2020/02/14 Javascript
Vue组件模板及组件互相引用代码实例
2020/03/11 Javascript
微信小程序自定义底部弹出框功能
2020/11/18 Javascript
arcgis.js控制地图地体的显示范围超出区域自动弹回(实现思路)
2021/01/28 Javascript
JavaScript Dom实现轮播图原理和实例
2021/02/19 Javascript
Python爬虫之xlml解析库(全面了解)
2017/08/08 Python
Python 200行代码实现一个滑动验证码过程详解
2019/07/11 Python
Python文件操作函数用法实例详解
2019/12/24 Python
Django在Model保存前记录日志实例
2020/05/14 Python
浅谈tensorflow 中的图片读取和裁剪方式
2020/06/30 Python
H5混合开发app如何升级的方法
2018/01/10 HTML / CSS
喜诗官方在线巧克力店:See’s Candies
2017/01/01 全球购物
Melissa鞋英国官方网站:Nonnon
2019/05/01 全球购物
大学军训感言800字
2014/02/27 职场文书
党员教师一句话承诺
2014/05/30 职场文书
2015年语文教师工作总结
2015/05/25 职场文书
Mybatis-Plus进阶分页与乐观锁插件及通用枚举和多数据源详解
2022/03/21 Java/Android