You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
JavaScript语言的特殊之处,就在于 函数内部可以直接读取全局变量。
不使用 var 声明的变量,则为全局变量。 b = 100;
function fn(){
var a = b = 1;
// ==> var a = window.b = 1; // a 是局部变量 b 是全局变量
}
fn();
console.log("b = ",b); // 1
console.log("a = ",a); //VM783:1 Uncaught ReferenceError: a is not defined
函数外部无法访问局部变量。 因此在外部,访问 a 变量 报错。 而 b 变量是 全局变量,因此可以访问到。
var a = 10;
setTimeout(function () {
alert(a); // 10, after one second
}, 1000);
4. 回调函数
//...
var x = 10;
// only for example
xmlHttpRequestObject.onreadystatechange = function () {
// 当数据就绪的时候,才会调用;
// 这里,不论是在哪个上下文中创建
// 此时变量“x”的值已经存在了
alert(x); // 10
};
//...
5. 创建封装的作用域来隐藏辅助对象:
var foo = {};
// 初始化
(function (object) {
var x = 10;
object.getX = function _getX() {
return x;
};
})(foo);
alert(foo.getX()); // 获得闭包 "x" – 10
One Day One Tip 之 闭包
总结:
概念:
闭包:能够读取其他函数内部变量的函数,在JavaScript中,一个函数return它内部的一个函数。
原理:通过引用变量从而阻止该变量被垃圾回收的机制
优:
缺:
零、所需知识
要理解闭包,首先必须理解 JavaScript 特殊的变量作用域。
变量的作用域无非就是两种: 全局变量 和 局部变量
JavaScript语言的特殊之处,就在于 函数内部可以直接读取全局变量。
不使用 var 声明的变量,则为全局变量。
b = 100;
函数外部无法访问局部变量。 因此在外部,访问 a 变量 报错。 而 b 变量是 全局变量,因此可以访问到。
一、闭包是什么
因为 a() 执行后,返回 的 方法 b, 内部引用了 tmp 变量, 导致 tmp 变量的标记+1, 垃圾回收机制就不会清除 tmp这个变量。
然后外部就可以继续访问到 tmp 变量。
二、闭包的作用
三、闭包的优缺点
优点
缺点
四、闭包用法实战
1. 对fun的计算方式进行定制
实际使用的时候,闭包可以创建出非常优雅的设计,允许对funarg上定义的多种计算方式进行定制。如下就是数组排序的例子,它接受一个排序条件函数作为参数:
同样的例子还有,数组的map方法是根据函数中定义的条件将原数组映射到一个新的数组中:
2. 函数式参数
使用函数式参数,可以很方便的实现一个搜索方法,并且可以支持无限制的搜索条件:
还有应用函数,比如常见的forEach方法,将函数应用到每个数组元素:
顺便提下,函数对象的 apply 和 call方法,在函数式编程中也可以用作应用函数。 apply和call已经在讨论“this”的时候介绍过了;这里,我们将它们看作是应用函数 —— 应用到参数中的函数(在apply中是参数列表,在call中是独立的参数):
3. 延迟调用
闭包还有另外一个非常重要的应用 —— 延迟调用:
4. 回调函数
5. 创建封装的作用域来隐藏辅助对象:
参考文章
The text was updated successfully, but these errors were encountered: