你必须知道的【闭包】陷阱和案例
闭包
In some languages, a closure may occur when a function is defined within another function, and the inner function refers to local variables of the outer function.
At run-time, when the outer function executes, a closure is formed, consisting of the inner function’s code and references (the upvalues) to any variables of the outer function required by the closure.
翻译:
在一些编程语言当中,闭包发生 :在一个函数内部定义了另外一个函数,并且内部的函数引用了外部函数的本地变量。
在运行的时候,当外部函数执行,这个时候形成了一个闭包,由内部函数的代码和对外部函数任意变量引用组成,这写引用都依赖于此闭包。
// ECMAScript
var f, g;
function foo() {
var x = 0;
f = function () { return ++x; };
g = function () { return --x; };
x = 1;
alert('inside foo, call to f(): ' + f()); // "2"
}
//外部函数执行,这个时候形成了闭包
foo();
//因为有了闭包,所以才访问到了 foo中的x
alert('call to g(): ' + g()); // "1"
//因为有了闭包,所以才访问到了 foo中的x
alert('call to f(): ' + f()); // "2"
javascript闭包陷阱与案例
在很多时候,由于内部函数的变量覆盖了闭包的变量,我们如果需要引用外部函数同名的变量,需要通过执行匿名函数,不外部函数的变量作为参数传递进来。如下所示:
(function(out_xxx){
//这里面就可以使用out_xxx
}(xxx))
可以看得出来,使用这种方式最多的地方是在我们定义对象的时候:
(function (window) {
var MyObject = function () {
this.initialize();
}
var p = DisplayObject.prototype;
p.initialize = function () {
}
window.MyObject = MyObject;
} (window));
这样定义对象有两个好处:
1.避免污染外部变量
2.传递参数的形式减少作用域查找
javascript为我们埋了很多坑,在许多场景下,我们需要利用以上的形式去解决问题,下面依依列出。
场景1 :
如下所示,我需要在cc方法中调用到外面的name:
var bb, cc;
function aa() {
var name = "当耐特";
bb = function () {
var name = "砖家";
cc = function () {
var name = "张磊";
alert(name);
}
}
相关新闻>>
- javascript闭包的高级用法
- JavaScript全面了解作用域(基础、this、闭包、继承)之一
- JavaScript全面了解作用域(基础、this、闭包、继承)之二
- 我知道的JavaScript -- 设计模式(桥接)应用之 – 验证器
- 我知道的JavaScript -- Json对象扁平化
- 我知道的JavaScript -- 数据结构之– Hashtable
- 学习Javascript闭包(Closure)
- 举例详细说明javascript作用域、闭包原理以及性能问题
- Javascript之Undefined你可能不知道的
- JavaScript重构(五):利用原型和闭包,完成组件方法
- 发表评论
-
- 最新评论 更多>>