一、累加计数
/*
* 目标:
* 1. 理解栈内存不销毁
* 2. 理解栈内存不销毁时保存在栈内存中的数据不销毁
*
* */
// 需求:累加计数;页面中有一个按钮,有一个初始值0,每点击一次这个按钮就要给这个值累加1;
// 思路:
// 点击的时候累加,所以这个按钮需要绑定一个点击事件
// 这个数字能够累加,说明数字一定是保存在了一个不销毁的地方;
var btn = document.getElementById('btn');
// 1. 利用全局作用域不销毁,保存这个数字的上一次的值
// var count = 0; // 所以我们需要把 count 放在全局作用域中,只要页面不关闭,全局作用域就不销毁,count 的值也就不销毁。(尽量少使用全局变量,因为可能会导致命名冲突)
/*btn.onclick = function () {
var count = 0; // count 在事件函数中,事件函数执行结束后,作用域就销毁了,所以 count 的值也就销毁了。所以 count 不能放这里面
count++;
btn.innerHTML = count;
};*/
// 2. 私有作用域保存上一次的值。(关键在于产生一个私有作用域,只有函数执行才会有私有作用域)
function countPlus() {
var count = 0;
btn.onclick = function () {
count++;
btn.innerHTML = count;
} // 函数中的引用数据类型(这个函数)被 btn 的 onclick 属性占用了,所以 contPlus 的作用域不能销毁
}
// countPlus();
// 3. 私有作用域不销毁
/*(function () { // 因为只是需要一个函数执行时形成作用域,其实我们并不需要函数名,所以把第二个方法改良成第三个
var count = 0;
btn.onclick = function () {
count++;
btn.innerHTML = count;
}
})();*/
// 4. 私有作用域不销毁 3
/*btn.onclick = (function () { // 不是把自执行函数赋值给 btn.onclick 属性,而是把自执行函数的返回值赋值给 btn.onclick 属性
var count = 0;
return function () {
count++;
btn.innerHTML = count;
}
})();*/
// 5. 块级作用域:块级作用域和私有作用域很类似,在块级作用域中声明的变量不能被外面访问;使用块级作用域时需要 let、 const 等声明变量,这个代码块才会被解析成块级作用域。
{
let count = 0; // 我们将 count 存在块级作用域中
btn.onclick = function () {
count++;
btn.innerHTML = count;
}
}
// console.log(count);
二、函数柯里化
柯里化函数思想:把多参数的函数变成单参数的函数
function fn(a, b, c) {
return a + b + c;
}
function fn1(a) {
return function (b) { // 这种在函数中 return 函数的做法是市面中认为的闭包
return function (c) {
return a + b + c;
}
}
}
fn1(1)(2)(3);
三、惰性封装
var utils = (function () {
var version = '1.0.1';
function sum(a, b) {
return a + b
}
function minus(a, b) {
return a - b;
}
return {
sum: sum,
minus: minus
}
})();