一、一个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作用域原理——作用域根据函数划分的更多相关文章

  1. JavaScript作用域原理(三)——作用域根据函数划分

    一.一个for实例 <p id="scope3" style="color:red"></p> var pscope3 = docume ...

  2. JavaScript作用域原理(二)——预编译

    JavaScript是一种脚本语言, 它的执行过程, 是一种翻译执行的过程.并且JavaScript是有预编译过程的,在执行每一段脚本代码之前, 都会首先处理var关键字和function定义式(函数 ...

  3. JavaScript作用域原理(一)——作用域链

    一.作用域的描述 JavaScript权威指南中对作用域有一句很精辟的描述:“JavaScript中的函数运行在它们被定义的作用域里,而不是它们被执行的作用域里.” 在JavaScript中,作用域的 ...

  4. 转载:Javascript作用域原理

    首先看一个例子: var name = 'laruence'; function echo() { alert(name); var name = 'eve'; alert(name); alert( ...

  5. 前端笔记知识点整合之JavaScript(四)关于函数、作用域、闭包那点事

    一.自定义函数function 函数就是功能.方法的封装.函数能够帮我们封装一段程序代码,这一段代码会具备某一项功能,函数在执行时,封装的这一段代码都会执行一次,实现某种功能.而且,函数可以多次调用. ...

  6. 前端笔记之JavaScript(四)关于函数、作用域、闭包那点事

    一.自定义函数function 函数就是功能.方法的封装.函数能够帮我们封装一段程序代码,这一段代码会具备某一项功能,函数在执行时,封装的这一段代码都会执行一次,实现某种功能.而且,函数可以多次调用. ...

  7. javascript作用域原理

    问题的提出 首先看一个例子: var name = 'laruence'; function echo() { alert(name); var name = 'eve'; alert(name); ...

  8. JavaScript中的作用域与函数和变量声明的提升

      var foo = 1; function bar() {     if (!foo) {         var foo = 10;     }     alert(foo); } bar(); ...

  9. 我所理解的javascript中函数的作用域和作用域链

    本文为原创,转载请注明出处: cnzt       文章:cnzt-p 写在前面 一周木有更新了,今天终于攻克了自行车难关,非常开心,特意来一更~ (那些捂嘴偷笑的人我看到你们了快把嘴闭上我会假装没看 ...

随机推荐

  1. [翻译] C# 8.0 新特性 Redis基本使用及百亿数据量中的使用技巧分享(附视频地址及观看指南) 【由浅至深】redis 实现发布订阅的几种方式 .NET Core开发者的福音之玩转Redis的又一傻瓜式神器推荐

    [翻译] C# 8.0 新特性 2018-11-13 17:04 by Rwing, 1179 阅读, 24 评论, 收藏, 编辑 原文: Building C# 8.0[译注:原文主标题如此,但内容 ...

  2. 如何用原生js或jquery设置select的值

    1.原生js设置select值的方法 (1)有时可能需要隐藏select,但是还得需要更改select所传递的值.(select的默认选中之为第一个,即下标为0的选项值) var gd2=docume ...

  3. Android实现开机自动运行程序

    有些时候,应用需要在开机时就自动运行,例如某个自动从网上更新内容的后台service.怎样实现开机自动运行的应用?在撰写本文时,联想到高焕堂先生以“Don't call me, I'll call y ...

  4. 何时应该使用Directive、Controller、Service?

    AngularJS:何时应该使用Directive.Controller.Service? 大漠穷秋 译 AngularJS是一款非常强大的前端MVC框架.同时,它也引入了相当多的概念,这些概念我们可 ...

  5. 获取http内容的php函数

    实现获取http内容的php函数. 代码如下: <?php function http_open($url, $data, $cookie = null, $method = "GET ...

  6. atitit.GUI图片非规则按钮跟动态图片切换的实现模式总结java .net c# c++ web html js

    atitit.GUI图片非规则按钮跟动态图片切换的实现模式总结java .net c# c++ web html js 1. 图片按钮的效果总结 1 1.1. 按钮图片自动缩放的. 1 1.2. 不要 ...

  7. 【转】oozie安装和自带示例的使用

    oozie安装 [转]http://www.tuicool.com/articles/qUVNJn oozie自带示例的使用 [转]http://blog.csdn.net/zhu_xun/artic ...

  8. dp之多重背包poj1276

    题意:有现今cash,和n种钱币,每种钱币有ni个,价值为di,求各种钱币组成的不超过cash的最大钱数....... 思路:二进制拆分转化为01背包,或者转化为完全背包都是可以的. 反思:这个题目我 ...

  9. Linux下C语言的调试

    调试是每个程序员都会面临的问题. 如何提高程序员的调试效率, 更好更快地定位程序中的问题从而加快程序开发的进度, 是大家共同面对的问题. 可能Windows用户顺口就会说出:用VC呗 :-) , 它提 ...

  10. 亿级Web系统的容错性建设实践(转)

    三年多前,我在腾讯负责的活动运营系统,因为业务流量规模的数倍增长,系统出现了各种各样的异常,那个时候,我7*24小时地没日没夜处理告警,周末和凌晨也经常上线,疲于奔命.后来,当时的老领导对我说:你不能 ...