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,iVBORw0KGgoAAAANSUhEUgAAARoAAADTCAIAAADRQUslAAAHm0lEQVR4nO3aO04jWxhF4RMSIbVEQIIsVWSJyBIic0JC4hhnjkg9AScENQmQB0BMygwYQk+hR9FBvU49bAz6ubvv1kJfQEPb5kp73VMuOhVvKwAhkvwnAGyQExCGnIAw5ASEIScgDDkBYcgJCENOQBhyAsKQExBmMqe7i3lqPmaXzdcv5ind3149/hp/q3hbFc/XZ6n7OH/qP9vUAy/vU5pfX2VP0n7l8r7/kPn11dvq6y99e57S2ePd+Pnb744eAnzfRE5Xj7OL5+rzu4t5t7+qsWadt+cppfvb+lFPs94on6/Pur95d/CBT7OUfjWvVX+repLL++whbS31y53+0kdy6n3r8rFXNfA9n13sPc3aoyBPq6jPiupbw9X2v3t3+IGri3n2wOy1BgfX5X3vRDpUxac/WPfA5+szDiVEm86pOhwGV1bVNVv7d7rVTk6zO3nuDj6w+rwO4y5Pq7rY6/08gyCPVNG99JHTqbmgnXMuIcw4p+odRXMUDE6n6JyK5+uz6q+1n7ytiv8ip/bViQphRjn1388MLswOVHHCxd6hnJpDKTumVsXpOX3xpcc3P5r/ZC78EGAyp2Zb9f+8P82pvufWLbI30OM5rYqnWZrPzue9QZ+c0/GX7r/pepp1B9Hz9XnvPVt+RwT4psk7e9nt6VMu9irVWOuPfJ2f5TS4vHxbFV/J6ehLr3o3/e9v8+fJ3h/SEmL8C7/GHfYG/E/9CzkBJsgJCENOQBhyAsKQExCGnIAw5ASEIScgDDkBYcgJCENOQBhyAsKQExCGnIAw5ASEIScgDDkBYcgJCENOQBhyAsKQExCGnIAw5ASEIScgDDkBYcgJCENOQBhyAsKQExCGnIAw5ASEIScgDDkBYcgJCENOQBhyAsKQExCGnIAw38/p5fcf4Evkcycn+JDPnZzgQz53coIP+dzJCT7kcycn+JDPnZzgQz53coIP+dzJCT7kcycn+JDPnZzgQz53coIP+dzJCT7kcycn+JDPnZzgQz53coIP+dzJCT7kcycn+JDPnZzgQz53coIP+dzJCT7kcycn+JDPnZzgQz53j5xel+mkj2L30X/gx8MipfXr8effro8953Kf/RiLsvz95+W9LNJmW31SfWW/SdUn+EnyudvkdPPwXv+x3N1khXw8LPLF5z4eFqdEcsB7WaQ0iGS7Tst9m1P30vXX1WuzJ5+7U07H8kgpperE6B4yOfFTzqvqhfJny552/VrntN80h+Ho8PzsPMT3yOfulFP9x89Pp/0mpZuH99Gh8V4WwwvC6uGvy66B7AmbbKozqtzdTCS8KMv9pv15+j8bgsnnbpjTy+86jMnrq3J301yhfZT7tp/6ZBs9JItnv0kpLff1V7br6oD6KHe990XbdSrWm6L7eV6X2TVhubsZvX9DGPncjXLal8Xxa71BcpX35lHTtwrGh9voK83pVN2xaN475Zd2m2V9ZXjkjRwCyOdulFObysm30ZrLs6nMar0Ayt1NWpcPi7Tcld35M3i5/Wb0tqp9ktEpilDyudvltN9MHkzjd0SnnWN1CXV4i7J8f11WbVQvtH4dnE6DjyrF6i1Tdp2JHyGfu1VO3enRv6DarructuuqliPXXfkZ0obXHjj5A5vvZm+NujsN7W+f6ufs6sIPkc/dKKdddQNt+uSZ/AXuiTnltyL6aTVfr3PKm/l4WPRetLl1od+cMfncjXIaB9DIT6fG13M6ZPRWrb7qy26IVy0t14dueCCGfO5+OZ3o+Nun8cXe0Y82kvoE22zr+xz1v41I2Z09ivo58rnb5HTax0n/+OiLcfZuRQwemP/+t7Zd868ifop87h45AX9eyImcEEg+d3KCD/ncyQk+5HMnJ/iQz52c4EM+d3KCD/ncyQk+5HMnJ/iQz52c4EM+d3KCD/ncyQk+5HMnJ/iQz52c4EM+d3KCD/ncyQk+5HMnJ/iQz52c4EM+d3KCD/ncyQk+5HMnJ/iQz52c4EM+d3KCD/ncyQk+5HMnJ/iQz52c4EM+d3KCD/ncyQk+5HMnJ/iQz52c4EM+d3KCD/ncyQk+5HMnJ/iQz52c4EM+d3KCD/ncyQk+5HMnJ/iQz52c4EM+d3KCD/ncyQk+5HMnJ/iQz52c4EM+d3KCD/ncyQk+5HMnJ/iQz52c4EM+d3KCD/ncyQk+5HMnJ/iQz52c4EM+d3KCD/ncyQk+5HMnJ/iQz52c4EM+d3KCD/ncyQk+5HMnJ/iQz52c4EM+d3KCD/ncyQk+5HMnJ/iQz52c4EM+d3KCD/ncyQk+5HMnJ/iQz52c4EM+d3KCD/ncyQk+5HMnJ/iQz52c4EM+d3KCD/ncyQk+5HMnJ/iQz52c4EM+d3KCD/ncyQk+5HMnJ/iQz52c4EM+d3KCD/ncyQk+5HMnJ/iQz52c4EM+d3KCD/ncyQk+5HMnJ/iQz52c4EM+d3KCD/ncyQk+5HMnJ/iQz52c4EM+d3KCD/ncyQk+5HMnJ/iQz52c4EM+9383JwAD5ASEIScgDDkBYcgJCENOQBhyAsKQExCGnIAw5ASEIScgDDkBYcgJCENOQBhyAsKQExCGnIAw5ASEIScgDDkBYcgJCENOQBhyAsL8BU7UIVkmxA6aAAAAAElFTkSuQmCC" 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 写在前面 一周木有更新了,今天终于攻克了自行车难关,非常开心,特意来一更~ (那些捂嘴偷笑的人我看到你们了快把嘴闭上我会假装没看 ...
随机推荐
- Eclipse+PyDev 安装和配置(转)
Python开发有很多工具,其中Eclipse+Pydev 是最常见的一种.本文简单介绍Windows下Eclipse+PyDev 安装和配置. Eclipse 是一种基于 Java 的可扩展开源开发 ...
- vector 类简介和例程
一.标准库的vector类型 vector是同一种类型的对象的集合 vector的数据结构很像数组,能非常高效和方便地访问单个元素 vector是一个类模板(class template) vecto ...
- 【Android UI设计与开发】使用ViewPager实现欢迎引导页面
一.实现的效果图 每次看别人的代码前,必需要先看实现的效果图达到了一个什么样的效果,是不是跟自己想要实现的效果类似.有图才有真相嘛,同一时候,最下方有源代码的下载地址,差点儿源代码的每一行都有凝视,写 ...
- 连载:面向对象葵花宝典:思想、技巧与实践(35) - NOP原则
NOP.No Overdesign Priciple.不要过度设计原则. 这应该是你第一次看到这个原则.而且你也不用上网查了,由于这个不是大师们创造的,而是我创造的:) 之所以提出这个原则,是我自己吃 ...
- scanf深究
例子: #include <stdio.h>#include <string.h> main(){ char buffer[1024]; scanf("%s" ...
- 构建SqlSessionFactory 的过程
1 SqlSessionFactory 的核心功能是创建 SqlSession 接口,而 SqlSessionFactory 是通过 SqlSessionFactoryBuilder 去构建. 构建步 ...
- Java类的实例化的初始化过程
A a = new A(); new 创建对象过程: 1.类加载 代码验证 2.给对象在内存(堆)中分配空间(给属性赋值): 3.属性赋默认值: byte,short.int,long -&g ...
- nyoj 15 括号匹配(2)
括号匹配(二) 时间限制:1000 ms | 内存限制:65535 KB 难度:6 描述 给你一个字符串,里面只包含"(",")","[" ...
- Xcode常见问题
今天真机测试的时候,突然出现了这个错误: not have an architecture that “Administrator”的 iPhone (3) can execute. 原因是我刚刚修 ...
- jMiniLang设计思路
前言 项目地址:https://github.com/bajdcc/jMiniLang 演示视频:https://www.bilibili.com/video/av13294962 jMiniLang ...