一、一个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. 5V系统和3.3V系统电平转换

    在设计一个带MCU或者ARM系统电路时候,经常遇见MCU的VCC是3.3V,但是外围电路需要5V.有时候是反过来.虽然现在MCU的IO都声称支持TTL电平,但是我们谁也不想将MCU的IO口直接接上5V ...

  2. 各种Map的区别,想在Map放入自定义顺序的键值对

    今天做统计时需要对X轴的地区按照地区代码(areaCode)进行排序,由于在构建XMLData使用的map来进行数据统计的,所以在统计过程中就需要对map进行排序. 一.简单介绍Map 在讲解Map排 ...

  3. memset 与 memcpy

    1. memset 需要的头文件 在C中 <string.h> 在C++中 <cstring> 原型: void *memset(void *s, int ch, size_t ...

  4. Hexo快速搭建静态博客并实现远程VPS自动部署

    这篇文章将如何搭建hexo,以及如何通过git webhooks实现远程vps的自动部署 这篇文件适合的条件: 简单的用于个人博客.公司博客展示,hexo的定位是静态博客,要实现动态服务器的功能并不适 ...

  5. C编程测试存储格式为大段还是小段

    目前,计算机存储系统有2种存储格式,大端和小端.数据在内存中存储时以字节为单位,一个int类型有4个字节,这就导致是高字节对应低地址(大端模式),高字节对应高地址(小端模式).大端和小端模式本身没有对 ...

  6. atitit.D&D drag&drop拖拽文件到界面功能 html5 web 跟个java swing c#.net c++ 的总结

    atitit.D&D drag&drop拖拽文件到界面功能 html5 web 跟个java swing c#.net c++ 的总结 1. DND的操作流程 1 2. Html5 注 ...

  7. ognl概念和原理详解

    一.问题的提出   在mvc中,数据是在各个层次之间进行流转是一个不争的事实.而这种流转,也就会面临一些困境,这些困境,是由于数据在不同世界中的表现形式不同而造成的: 1. 数据在页面上是一个扁平的, ...

  8. Windows 10 开发人员预览版中的新增功能(转自 IT之家)

    Windows 10 开发人员预览版中的新增功能 在Win10预览版中安装工具与SDK后,即可着手创建Windows通用应用或先浏览目前的环境与此前相比都发生了什么变化. 应用建模 文件资源管理器: ...

  9. Django QuerySet 方法梳理 。model外键 多对多的保存

    引用:https://feifeiyum.github.io/2017/03/28/python-django-queryset/ 说明 Models 层是 Django 框架中最强大的部分之一, 大 ...

  10. Linux IO实时监控iostat命令详解(转载)

    简介 iostat主要用于监控系统设备的IO负载情况,iostat首次运行时显示自系统启动开始的各项统计信息,之后运行iostat将显示自上次运行该命令以后的统计信息.用户可以通过指定统计的次数和时间 ...