Open huandie2012 opened 7 years ago
首先要知道什么是闭包就得知道闭包是怎么产生的。在javascript中只有函数存在作用域,并且函数可以被嵌套使用,当我们使用函数套用的时候就产生了一个有趣的现象,我们在子函数中可以任意访问外部函数中定义的变量和方法,但是外面的函数却得不到里面函数中定义的变量。也就是子作用域被封闭起来。那么问题来了,如何拿到子作用域里的变量呢?因此闭包出现了。也就是说闭包的唯一目的就是获取子作用域。
(function(window){ //私有属性 var privateThing; function privateMethod(){ //私有方法 } window.api = { //暴露公共接口 } })(window)
module pattern
var api = (function(){ // Private and in-place! var local = 0; //私有作用域 function counter () { return ++local; } //暴露给api return { counter: counter }; })(); api.counter(); // <- 1 api.counter(); // <- 2
//这是一个60秒倒计时的计时器 var step = 0; var timer = setInterval(function(){ if(step<60){ step++; }else{ clearInterval(timer); } },1000);
function bind(context,name){ return function(){ return context[name].apply(context,arguments); }; }
Function.prototype.curry = function() { var fn = this, args = Array.prototype.slice.call(arguments); return function() { return fn.apply(this, args.concat( Array.prototype.slice.call(arguments))); }; };
Function.prototype.partial = function() { var fn = this, args = Array.prototype.slice.call(arguments); return function() { var arg = 0; for (var i = 0; i < args.length && arg < arguments.length; i++) { if (args[i] === undefined) { args[i] = arguments[arg++]; } } return fn.apply(this, args); }; };
Function.prototype.memoized = function(key){ this._values = this._values || {}; return this._values[key] !== undefined ? this._values[key] : this._values[key] = this.apply(this, arguments); }; function isPrime(num) { var prime = num != 1; for (var i = 2; i < num; i++) { if (num % i == 0) { prime = false; break; on behavior 107 } } return prime; }
立即执行函数 javascript (function() { // child scope })();
javascript
!function () { // child scope }();
+function () { // child scope }();
-function () { // child scope }();
~function () { // child scope }();
void function () { // child scope }();
1^function () { // child scope }();
1&function () { // child scope }();
说明
首先要知道什么是闭包就得知道闭包是怎么产生的。在javascript中只有函数存在作用域,并且函数可以被嵌套使用,当我们使用函数套用的时候就产生了一个有趣的现象,我们在子函数中可以任意访问外部函数中定义的变量和方法,但是外面的函数却得不到里面函数中定义的变量。也就是子作用域被封闭起来。那么问题来了,如何拿到子作用域里的变量呢?因此闭包出现了。也就是说闭包的唯一目的就是获取子作用域。
闭包的常见应用
module pattern
立即执行函数
javascript
(function() { // child scope })();!function () { // child scope }();
+function () { // child scope }();
-function () { // child scope }();
~function () { // child scope }();
void function () { // child scope }();
1^function () { // child scope }();
1&function () { // child scope }();