JavaScript作用域原理——作用域根据函数划分
一、一个for实例
<p id="scope3" style="color:red"></p>

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、作用域的关系大致如下:
aaarticlea/png;base64,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" alt="" />
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语句块的局部变量。
JavaScript作用域原理——作用域根据函数划分的更多相关文章
- JavaScript作用域原理(三)——作用域根据函数划分
一.一个for实例 <p id="scope3" style="color:red"></p> var pscope3 = docume ...
- JavaScript作用域原理(二)——预编译
JavaScript是一种脚本语言, 它的执行过程, 是一种翻译执行的过程.并且JavaScript是有预编译过程的,在执行每一段脚本代码之前, 都会首先处理var关键字和function定义式(函数 ...
- JavaScript作用域原理(一)——作用域链
一.作用域的描述 JavaScript权威指南中对作用域有一句很精辟的描述:“JavaScript中的函数运行在它们被定义的作用域里,而不是它们被执行的作用域里.” 在JavaScript中,作用域的 ...
- 转载:Javascript作用域原理
首先看一个例子: var name = 'laruence'; function echo() { alert(name); var name = 'eve'; alert(name); alert( ...
- 前端笔记知识点整合之JavaScript(四)关于函数、作用域、闭包那点事
一.自定义函数function 函数就是功能.方法的封装.函数能够帮我们封装一段程序代码,这一段代码会具备某一项功能,函数在执行时,封装的这一段代码都会执行一次,实现某种功能.而且,函数可以多次调用. ...
- 前端笔记之JavaScript(四)关于函数、作用域、闭包那点事
一.自定义函数function 函数就是功能.方法的封装.函数能够帮我们封装一段程序代码,这一段代码会具备某一项功能,函数在执行时,封装的这一段代码都会执行一次,实现某种功能.而且,函数可以多次调用. ...
- javascript作用域原理
问题的提出 首先看一个例子: var name = 'laruence'; function echo() { alert(name); var name = 'eve'; alert(name); ...
- JavaScript中的作用域与函数和变量声明的提升
var foo = 1; function bar() { if (!foo) { var foo = 10; } alert(foo); } bar(); ...
- 我所理解的javascript中函数的作用域和作用域链
本文为原创,转载请注明出处: cnzt 文章:cnzt-p 写在前面 一周木有更新了,今天终于攻克了自行车难关,非常开心,特意来一更~ (那些捂嘴偷笑的人我看到你们了快把嘴闭上我会假装没看 ...
随机推荐
- Web中路径问题
如果在web项目中需要使用路径,如:转发.重定向还有超链接等. 原则:”一切web路径以/开始” 那么/的路径一定是相对路径,那么/到底代表哪一个相对路径是需要智慧的. 如果该路径是给服务器使用的,那 ...
- jQuery ajax 流程全解析
实例解析java + jQuery + json工作过程(登录) 本文主要讲解在java环境下使用jQuery进行JSON数据传送的交互过程 参考根据作者的账务管理系统(个人版) 源码下载 讲解 一. ...
- Linux命令-目录处理命令:mv
注意:在linux下面,剪切文件和改名是同一个命令mv,而不是两个独立的命令. mv /tmp/beijing/chaoyangqu /root 移动chaoyangqu目录到root目录下面 mv ...
- python笔记-print输出
print语句默认是输出一行后添加一个换行符 >>> for item in ['apple','ibm','google','oracle']: ... print item .. ...
- C#:向SqlServer数据库中插入imange类型
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServi ...
- Python多线程1:threading
threading模块提供了高级别的线程接口,基于低级别的_thread模块实现. 模块基本方法 该模块定了的方法例如以下: threading.active_count() 返回当前 ...
- Dev属性设置
DisplayFormat 设置显示格式如:{0:P}表示显示为百分号模式.如数据源中为0.5.表示出来为50% 2.GridContro总合计及分组合计: 常规总合计直接RunDesigner-Gr ...
- 关闭windows打印服务
1.关闭打印服务:开始-运行-services.msc或打开控制面板-管理工具-服务,打开服务列表,找到Print Spooler(打印服务),关闭(右击,点“关闭”).2.删除打印缓存:进入c:\\ ...
- Nginx+Windows负载均衡(转载)
一.下载Nginxhttp://nginx.org/download/nginx-1.0.8.zip解压到C:\nginx目录下二.在两台服务器上分别建一个网站:S1:192.168.16.35:80 ...
- Qt 积累
总结(-) 1> 定时器的使用 QTimer *timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(u ...