一、累加计数

  1. /*
  2. * 目标:
  3. * 1. 理解栈内存不销毁
  4. * 2. 理解栈内存不销毁时保存在栈内存中的数据不销毁
  5. *
  6. * */
  7. // 需求:累加计数;页面中有一个按钮,有一个初始值0,每点击一次这个按钮就要给这个值累加1;
  8. // 思路:
  9. // 点击的时候累加,所以这个按钮需要绑定一个点击事件
  10. // 这个数字能够累加,说明数字一定是保存在了一个不销毁的地方;
  11. var btn = document.getElementById('btn');
  12. // 1. 利用全局作用域不销毁,保存这个数字的上一次的值
  13. // var count = 0; // 所以我们需要把 count 放在全局作用域中,只要页面不关闭,全局作用域就不销毁,count 的值也就不销毁。(尽量少使用全局变量,因为可能会导致命名冲突)
  14. /*btn.onclick = function () {
  15. var count = 0; // count 在事件函数中,事件函数执行结束后,作用域就销毁了,所以 count 的值也就销毁了。所以 count 不能放这里面
  16. count++;
  17. btn.innerHTML = count;
  18. };*/
  19. // 2. 私有作用域保存上一次的值。(关键在于产生一个私有作用域,只有函数执行才会有私有作用域)
  20. function countPlus() {
  21. var count = 0;
  22. btn.onclick = function () {
  23. count++;
  24. btn.innerHTML = count;
  25. } // 函数中的引用数据类型(这个函数)被 btn 的 onclick 属性占用了,所以 contPlus 的作用域不能销毁
  26. }
  27. // countPlus();
  28. // 3. 私有作用域不销毁
  29. /*(function () { // 因为只是需要一个函数执行时形成作用域,其实我们并不需要函数名,所以把第二个方法改良成第三个
  30. var count = 0;
  31. btn.onclick = function () {
  32. count++;
  33. btn.innerHTML = count;
  34. }
  35. })();*/
  36. // 4. 私有作用域不销毁 3
  37. /*btn.onclick = (function () { // 不是把自执行函数赋值给 btn.onclick 属性,而是把自执行函数的返回值赋值给 btn.onclick 属性
  38. var count = 0;
  39. return function () {
  40. count++;
  41. btn.innerHTML = count;
  42. }
  43. })();*/
  44. // 5. 块级作用域:块级作用域和私有作用域很类似,在块级作用域中声明的变量不能被外面访问;使用块级作用域时需要 let、 const 等声明变量,这个代码块才会被解析成块级作用域。
  45. {
  46. let count = 0; // 我们将 count 存在块级作用域中
  47. btn.onclick = function () {
  48. count++;
  49. btn.innerHTML = count;
  50. }
  51. }
  52. // console.log(count);

二、函数柯里化

柯里化函数思想:把多参数的函数变成单参数的函数

  1. function fn(a, b, c) {
  2. return a + b + c;
  3. }
  4. function fn1(a) {
  5. return function (b) { // 这种在函数中 return 函数的做法是市面中认为的闭包
  6. return function (c) {
  7. return a + b + c;
  8. }
  9. }
  10. }
  11. fn1(1)(2)(3);

三、惰性封装

  1. var utils = (function () {
  2. var version = '1.0.1';
  3. function sum(a, b) {
  4. return a + b
  5. }
  6. function minus(a, b) {
  7. return a - b;
  8. }
  9. return {
  10. sum: sum,
  11. minus: minus
  12. }
  13. })();