javascript——作用域与闭包
http://www.cnblogs.com/lucio-yr/p/4047972.html
一、作用域:
- 在函数内部:用 var 声明的表示局部变量,未用var的是全局变量。
- 作用域取决于变量定义时,而不是执行时。
例1:

var a=123; //全局变量
function f()
{
document.writeln(a +'</br>'); //(1)
var a=1; //局部变量
document.writeln(a +'<br/>'); //(2)
}
f();
变量作用域例子1
结果如下:

注:在(1)处虽然局部变量 a 尚未定义,而外面的全局变量已经定义,但在函数f内部,局部变量本身已经存在本地空间,因此 (1)处访问的 a 是局部变量。
例2:

function f1(){var b=1;return f2();}
function f2(){return b;}
f1();
var b=2;
f1();
变量作用域例子2
注: f2 中的 b 未定义,而 f1 中的 b 是局部变量,因此 函数 f1 与 f2 之间的变量是不可相互访问的。当定义全局变量 b=2 后,此时执行 f1 中的 b 与全局变量 b 是两个不同的变量, f2 中的 b 实际上操作的是全局变量。
可以将函数 f1 中的变量声明为全局变量。如下:

二、闭包:在外部访问内部局部变量
例1:

function f()
{
var b='b';
return function(){ return b;};
}
var n=f();
n(); "b"
或
函数 f 中的变量 b 是一个局部变量,外界原本是无法获取的,通过将一个函数的引用传递出去,使外界获得访问内部的权限,如下图,变量 n 指向了内部函数,而内部函数与变量 b 同属于函数 f ,自然可以有效的访问变量 b 。当然有一部分人可能会说 n 本身就是函数而不是变量,这里就是仁者见仁智者见智了。

例2:

如果一个函数需要在其父级函数返回之后留住对父级作用域的链接的话,就必须为此建立一个闭包,务必注意的是在(1)处,绑定的是作用域本身,而不是每个变量的值,如果后面变量 arg 发生变化,则执行 n 时,获取的都是最新值。它使用的值是从执行环境中获取的。

例3:

function funct()
{
var a=[]; var i;
for(i=0;i<3;i++)
{
a[i]=function(){ return i;};
}
return a;
};
var a=funct();
a[0](); //
a[1](); //
a[2](); //
闭包的陷阱
如上所示,数组 a 的元素在循环中仅仅是保存了一个函数的引用,这些函数并没有执行。闭包并不记录向数组赋值时对立的 i 值,在循环完后,i 变为了3,当当执行这些函数时,函数采取查找变量 i ,获取的 i 是最新值,也就均是相同的3.
修改如下:

function funct()
{
var a=[]; var i;
for(i=0;i<3;i++)
{
a[i]=
(
function(x)
{
return function(){ return x;}; //(1)
}
)(i); // 立即执行
}
return a;
};
var a=funct();
a[0](); //
a[1](); //
a[2](); //
在(1)处,当 i 为1时,则相当于 a[1]=function(){return 1;}。
javascript——作用域与闭包的更多相关文章
- javascript作用域和闭包之我见
javascript作用域和闭包之我见 看了<你不知道的JavaScript(上卷)>的第一部分--作用域和闭包,感受颇深,遂写一篇读书笔记加深印象.路过的大牛欢迎指点,对这方面不懂的同学 ...
- JavaScript 作用域和闭包——另一个角度:扩展你对作用域和闭包的认识【翻译+整理】
原文地址 --这篇文章有点意思,可以扩展你对作用域和闭包的认识. 本文内容 背景 作用域 闭包 臭名昭著的循环问题 自调用函数(匿名函数) 其他 我认为,尝试向别人解释 JavaScript 作用域和 ...
- JavaScript作用域和闭包
在JavaScript中,作用域是执行代码的上下文.作用域有3种类型: 1.全局作用域 2.局部作用域---(又叫函数作用域) 3.eval作用域 var foo =0;//全局作用域console. ...
- 举例详细说明javascript作用域、闭包原理以及性能问题(转)
转自:http://www.cnblogs.com/mrsunny/archive/2011/11/03/2233978.html 这可能是每一个jser都曾经为之头疼的却又非常经典的问题,关系到内存 ...
- JavaScript 作用域和闭包
作用域的嵌套将形成作用域链,函数的嵌套将形成闭包.闭包与作用域链是 JavaScript 区别于其它语言的重要特性之一. 作用域 JavaScript 中有两种作用域:函数作用域和全局作用域. 在一个 ...
- javascript作用域、闭包、对象与原型链
原文作者总结得特别好,自己收藏一下.^-^ 1.作用域1.1函数作用域JS的在函数中定义的局部变量只对这个函数内部可见,称之谓函数作用域.它没有块级作用域(因此if.for等语句中的花括号不是独立作用 ...
- javascript作用域与闭包
Javasript作用域概要 在javascript中,作用域是执行代码的上下文,作用域有三种类型: 1) 全局作用域 2) 局部作用域(函数作用域) 3) eval作用域 var foo = ...
- JavaScript作用域与闭包总结
1.全局作用域 所有浏览器都支持 window 对象,它表示浏览器窗口,JavaScript 全局对象.函数以及变量均自动成为 window 对象的成员.所以,全局变量是 window 对象的属性,全 ...
- 《JavaScript 闯关记》之作用域和闭包
作用域和闭包是 JavaScript 最重要的概念之一,想要进一步学习 JavaScript,就必须理解 JavaScript 作用域和闭包的工作原理. 作用域 任何程序设计语言都有作用域的概念,简单 ...
随机推荐
- COUNT(DISTINCT a.TransportOrderID)的用法
DECLARE @StartDate DATETIME= '2017-12-20 00:00:00';DECLARE @EndDate DATETIME= '2017-12-26 00:00:00'; ...
- Node.js初接触(一)
本来还在纠结着到底要学哪一种后台语言呢,突然发现node.js很火,既然能被这么多人推崇,自然是有他的优势的.去百度百科看了一眼,或许是我理解能力太差,并没有了解到很多关于node.js的东西,大概就 ...
- Office 2016 (Preview)
Office 2016 Preview for MAC (预览版) https://products.office.com/zh-CN/mac/mac-preview 安装下载:http://go.m ...
- JAVA常见函数
输入函数 : Scanner cin=new Scanner(System.in); int a=cin.nextInt(); //输入一个int数据 double dl=cin.nextDou ...
- RK30SDK系统重启源码分析
Linux系统重启的最底层函数是arch_reset,这是一个全局的函数指针变量,定义在 arch/arm/mach-rk30/include/mach/system.h中: extern void ...
- LSM树——LSM 将B+树等结构昂贵的随机IO变的更快,而代价就是读操作要处理大量的索引文件(sstable)而不是一个,另外还是一些IO被合并操作消耗。
Basic Compaction 为了保持LSM的读操作相对较快,维护并减少sstable文件的个数是很重要的,所以让我们更深入的看一下合并操作.这个过程有一点儿像一般垃圾回收算法. 当一定数量的ss ...
- 【新手专属】IntelliJ IDEA删除项目
这两天刚从Eclipse转手IDEA,每次都是直接删项目文件,后来百度一下才明白原来应该这样~~~ IntelliJ IDEA 删除项目,共三步: 第一步:记住当前项目文件路径1,然后点击file-- ...
- MySQL 创建千万集数据
- MySQL测试任务:使用存储过程,往表中插入千万级数据,根据索引优化速度 -- 1.使用索引查询 -- 2.不使用索引查 -- 3.比较两者查询速度的差异 1.创建数据和索引 1.创建索引测试表 ...
- 2018年 7月总结&8月计划
7月悄然而过... 英语: a打卡率:1号上课没有完成听力,7号上课没有完成阅读,21,22号考试 没有阅读 PS:学习效果测评 1)不要再阅读china English 2)单词要拼写 3)听力句子 ...
- 【机器学习】集成学习之xgboost的sklearn版XGBClassifier使用教程
XGBClassifier是xgboost的sklearn版本.代码完整的展示了使用xgboost建立模型的过程,并比较xgboost和randomForest的性能. # -*- coding: u ...