javascript 中的闭包
在 javascript 中,函数可以当做参数传递,也可以当做返回值返回。
当一个函数内部返回值为一个函数时, 就形成了闭包。(闭包里面的 this 问题)
如下面代码
Function.prototype.after = function (action) {
var func = this;
return function () {
var result = func.apply(this, arguments);
action.apply(this,arguments);
return result;
};
};
var foo= function(a){
console.log(a);
}
foo = foo.after(function(){console.log(2)});
foo = foo.after(function(){console.log(3)});
foo(12);
可以这样理解: foo1 = foo.after(function(){console.log(2);});
foo2 = foo1.after(function(){console.log(3);});
foo2(12); // 当foo2(); 执行的时候,有点类似于递归, fun.apply(this.args);(这个里面递归执行) action();
foo2() => foo1(); console.log(3);
=> foo();console.log(2); console.log(3);
=> console.log(12); console.log(2); console.log(3);
执行结果是: 12
2
3
闭包里面的 this 问题, 如果上面不用 var func = this; 来保存一下当前的 this 的话,而仅仅是
Function.prototype.after = function (action) {
return function () {
var result = this.apply(this, arguments);
action.apply(this,arguments);
return result;
};
};
会报错误: this.apply() is not a function!
这是因为 函数 function(){} 里面的this 此时指向的是 window 这个全局对象!
javascript 中的闭包的更多相关文章
- 让你分分钟学会Javascript中的闭包
Javascript中的闭包 前面的话: 闭包,是 javascript 中重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,你很难从定义去理解它 ...
- 难道这就是JavaScript中的"闭包"
其实对于JavaScript中的"闭包"还没真正理解,这次在实际Coding中似乎遇到了"闭包"的问题,仅此摘录,以待深究. 表现为jQuery的post方法回 ...
- 浅谈JavaScript中的闭包
浅谈JavaScript中的闭包 在JavaScript中,闭包是指这样一个函数:它有权访问另一个函数作用域中的变量. 创建一个闭包的常用的方式:在一个函数内部创建另一个函数. 比如: functio ...
- javascript中的闭包解析
学习javaScript已经有一段时间了,在这段时间里,已经感受到了JavaScript的种种魅力,这是一门神奇的语言,同时也是一门正在逐步完善的语言,相信在大家的逐步修改中,这门语言会逐步的完善下去 ...
- JavaScript中的闭包理解
原创文章,转载请注明:JavaScript中的闭包理解 By Lucio.Yang 1.JavaScript闭包 在小学期开发项目的时候,用node.js开发了服务器,过程中遇到了node.js的第 ...
- 【JS】JavaScript中的闭包
在JavaScript中,闭包指的是有权访问另一个函数作用域中的变量的函数:创建闭包最常见的方式就是在一个函数内创建另一个函数.如下例子: function A(propertyName){ retu ...
- Javascript中的闭包(转载)
前面的话: 闭包,是 javascript 中重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,你很难从定义去理解它.下面是作者从作用域链慢慢讲到 ...
- 狗日的Javascript中的闭包
前面的话: 闭包,是 javascript 中重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,你很难从定义去理解它.下面是作者从作用域链慢慢讲到 ...
- [译]Javascript中的闭包(closures)
本文翻译youtube上的up主kudvenkat的javascript tutorial播放单 源地址在此: https://www.youtube.com/watch?v=PMsVM7rjupU& ...
- javaScript中的闭包原理 (译)
这篇文章通过javaScript代码解释了闭包的原理,来让编程人员理解闭包.它不是写给大牛或使用功能性语言进行编程的程序员的.一旦意会了其核心概念,闭包理解起来并不难.然而,你不可能通过阅读任何有关闭 ...
随机推荐
- EntityFramework日志记录
首先在应用启动时执行:DbInterception.Add(new LogFormatter()); 然后加入如下类: #region [ EF的数据库执行日志记录 ] public class ...
- TransactionScope的使用
本文导读:在实际开发工作中,执行一个事件,然后调用另一接口插入数据,如果处理逻辑出现异常,那么之前插入的数据将成为垃圾数据,我们所希望的是能够在整个这个方法定义为一个事务,TransactionSco ...
- UnicodeEncodeError: 'ascii' codec can't encode characters in position 14-15: ordinal not in range(128)
python在安装时,默认的编码是ascii,当程序中出现非ascii编码时,python的处理常常会报类似这样的错误. UnicodeEncodeError: 'ascii' codec can't ...
- Java Concurrent Topics
To prevent Memory Consistency Errors(MCEs), it is good practice to specify synchronized class specif ...
- VJ16216/RMQ/线段树单点更新
题目链接 /* 单点更新,用RMQ维护最大值,add对c[i]修改,或加,或减. 求[l,r]的和,用sum(r)-sum(l-1).即可. */ #include<cmath> #inc ...
- Android中用友盟实现QQ的第三方登录
//首先应该去友盟的官网注册你的账号,创建一个应用,获得它的APPkey,也可以用它的API上的appkey,下载SDK,下面根据API文档一步步实现就行了. //下面是友盟的APi文档 1. 产品 ...
- XListview刷新和加载
//继承IXListViewListenerpublic class MainActivity extends Activity implements OnItemClickListener,IXLi ...
- HDU1879--继续畅通工程(最小生成树)
Problem Description 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).现得到城镇道路统计 ...
- HDU 1054 Strategic Game(树形DP)
Strategic Game Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- IDL 建立影像金字塔
形成按目录放好的,类似于Google Map Tile的金字塔瓦片Jpg. 1: ; 2: pro tsplit 3: ; 读入Jpeg格式文件 4: szFile = 'e:\test.jpg'; ...