博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaScript作用域原理(三)——作用域根据函数划分
阅读量:6679 次
发布时间:2019-06-25

本文共 2109 字,大约阅读时间需要 7 分钟。

一、一个for实例

     var pscope3 = document.getElementById('scope3');        function scope3() {            for(var i=0; i<10; i++){                            }            echo(pscope3,  i);        }        scope3();

1、函数在java、C#等语言中,变量i只会在for循环语句中有定义,循环结束,i也就被销毁了。但在JavaScript中,变量i是定义在scope3()活动对象中的,因此在它定义开始,就可以在函数内部访问它。

2、打印出的i为“10”。

3、函数scope3等效于下面的代码:

     function scope3() {            var i;            for(i=0; i<10; i++){                            }            echo(pscope3,  i);        }

 

二、私有作用域的匿名函数

     function anonymous() {            var position = 'in anonymous';            (function(){                for(var i=0; i<10; i++){                                }                echo(pscope3, position);//打印显示"in anonymous"            })();            //pscope3.innerHTML += i;//报错        }        anonymous();

1、匿名函数可以用来模仿块级作用域,避免上面的那个问题。

2、在for循环外部插入了一个私有作用域。在匿名函数中定义的任何变量,都会在执行结束时被销毁。

3、上面的那句注释掉的话,取消注释的话,就会显示错误信息:“ReferenceError: i is not defined”。

4、作用域的关系大致如下:

5、position是定义在anonymous函数中的,但可以在匿名函数中打印出来,因为anonymous的作用域包住了匿名函数,在匿名函数中找不到position定义,就往外找。

 

三、try语句catch部分的特殊情况

     function capture() {            var ex = 'in capture';            try{                  i;            }catch(ex){                var position= 'in catch';                echo(pscope3, ex); //ReferenceError: i is not defined                var ex = 'is catching';                echo(pscope3, position);//in catch                echo(pscope3, ex);//is catching            }            echo(pscope3, position);//in catch            echo(pscope3, ex); //in capture 不是catch中赋的值            echo(pscope3, window.ex); //undefined        }        capture();

1、catch的一个参数ex与capture函数下的局部变量ex同名。

2、catch中先打印ex,是错误信息,然后赋值为“is catching”,打印出来,但很奇怪,catch外面打印的ex是“in capture”,并不是里面覆盖的值。

3、position在catch中定义,但是可以在catch的外面打印出来。

4、window.ex输出的是undefined,也就是说ex不是全局的,因此可以推出catch后面的大括号是普通语句块的性质。

5、ex的性质可以视为唯一一个把catch语句块当做块作用域的变量,是catch语句块的局部变量。

 

 

 

demo下载:

 

参考资料:

Javascript作用域原理

JavaScript 开发进阶:理解 JavaScript 作用域和作用域链

Javascript之匿名函数(模仿块级作用域)

try-catch语句的“伪块作用域”

变量作用域 (JavaScript)

javascript变量的作用域

深入浅出JavaScript变量作用域

try-catch语句的“伪块作用域”

 

转载地址:http://scnao.baihongyu.com/

你可能感兴趣的文章
JAVA入门到精通-第24讲-容器、集合类
查看>>
Silverlight 如何手动打包xap
查看>>
VMware-workstation安装
查看>>
vue 开发2017年变化回顾及2018年展望
查看>>
利用FluorineFX录制音频与视频
查看>>
web api 文档声明
查看>>
Ubuntu下配置 keepalived+nginx+tomcat 负载均衡
查看>>
ffmpeg对rtmp的基本操作[转]
查看>>
iframe嵌入页面不能全部展示
查看>>
PHP 流程
查看>>
angular 自定义指令详解
查看>>
自写 zTree搜索功能 -- 关键字查询 -- 递归无限层
查看>>
软件工程——四则运算3(C#)
查看>>
我的软考之路(八)——三大原则学会数据流图
查看>>
Grails开发环境的高速搭建
查看>>
jQuery Ajax遍历表格,填充数据,将表格中的数据一条一条拼成Jason数组
查看>>
Redis为什么这么快
查看>>
js获取宽度设置thickbox百分比
查看>>
检测输入框字数的变化 注意onpropertychange oninput onchange onkeyup区别
查看>>
arm_GPIO_简单编程例题
查看>>