# 0x01 什么是闭包

当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使函数是在当前词法作用域之外执行。

function foo() {
  var a = 2;
  function bar() {
    console.log(a);
  }
  return bar;
}

var baz = foo();
baz(); // 输出: 2

# 0x02 利用闭包实现备用函数

// 备忘函数
function memorize(fn) {
  var cache = {};

  return function() {
    var args = Array.prototype.slice.call(arguments);
    var key = JSON.stringify(args);
    return cache[key] || (cache[key] = fn.apply(fn, args));
  };
}

var adder = memorize(add);
console.log("adder(1): ", adder(1));

# 0x03 利用闭包实现 函数柯里化 currying

function currying(fn) {
  // 获取得到所有参数
  var rest1 = Array.prototype.slice.call(arguments); // [f, "atom.hu"]
  // 去除方法名
  rest1.shift();

  return function() {
    var rest2 = Array.prototype.slice.call(arguments); // ['10', '咸的']
    return fn.apply(null, rest1.concat(rest2));
  };
}

// 接上面
function sayHello(name, age, fruit) {
  console.log(console.log(`我叫 ${name},我 ${age} 岁了, 我喜欢吃 ${fruit}`));
}

var currying = currying(sayHello, "atom.hu");
var curryingShowMsg = currying("10", "咸的"); // 我叫 atom.hu,我 10 岁了, 我喜欢吃 咸的

# 0x04 页面调试小技巧

添加书签

javascript: (function() {
  var elements = document.body.getElementsByTagName("*");
  var items = [];
  for (var i = 0; i < elements.length; i++) {
    if (
      elements[i].innerHTML.indexOf("html * { outline: 1px solid red }") != -1
    ) {
      items.push(elements[i]);
    }
  }
  if (items.length > 0) {
    for (var i = 0; i < items.length; i++) {
      items[i].innerHTML = "";
    }
  } else {
    document.body.innerHTML +=
      "<style>html * { outline: 1px solid red }</style>";
  }
})();
最后编辑时间: 2/25/2020, 11:34:19 PM