huandie2012 / blog

Introduction of knowledge points
3 stars 1 forks source link

JS闭包总结 #6

Open huandie2012 opened 7 years ago

huandie2012 commented 7 years ago

说明

首先要知道什么是闭包就得知道闭包是怎么产生的。在javascript中只有函数存在作用域,并且函数可以被嵌套使用,当我们使用函数套用的时候就产生了一个有趣的现象,我们在子函数中可以任意访问外部函数中定义的变量和方法,但是外面的函数却得不到里面函数中定义的变量。也就是子作用域被封闭起来。那么问题来了,如何拿到子作用域里的变量呢?因此闭包出现了。也就是说闭包的唯一目的就是获取子作用域。

闭包的常见应用

  1. 模拟私有变量 JavaScript 并不提供原生的支持,但是可以使用闭包模拟私有方法。私有方法不仅仅有利于限制对代码的访问:还提供了管理全局命名空间的强大能力,避免非核心的方法弄乱了代码的公共接口部分。这种方式也称为 模块模式 module import variant
    (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 
  2. 回调和计时器 在处理回调和计时器的时候我们可以使用闭包,这两个函数都需要异步被调用而且会很频繁的获取外部的数据. 异步回调(cb)最常见的是Ajax请求,例子就不举了用过jquery的同学都知道.
    //这是一个60秒倒计时的计时器
    var step = 0;
    var timer = setInterval(function(){
    if(step<60){
      step++;
    }else{
     clearInterval(timer);
    }
    },1000);
  3. 绑定函数作用域
    function bind(context,name){
    return function(){
     return context[name].apply(context,arguments);
    };
    }
  4. 参数归并技术以及函数柯里化
    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);
    };
    };
  5. 记忆和包裹函数
    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;
    }
  6. 立即执行函数 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 }();