# 闭包
# 创建 Hello World 函数
请你编写一个名为 createHelloWorld 的函数。它应该返回一个新的函数,该函数总是返回 "Hello World" 。
# 示例 1:
输入:args = []
输出:"Hello World"
解释:
const f = createHelloWorld();
f(); // "Hello World"
createHelloWorld 返回的函数应始终返回 "Hello World"。
# 示例 2:
输入:args = [{},null,42]
输出:"Hello World"
解释:
const f = createHelloWorld();
f({}, null, 42); // "Hello World"
可以传递任何参数给函数,但它应始终返回 "Hello World"。
const createHelloWorld = (...args) => () => "Hello World";
console.log("结果", createHelloWorld([])());
console.log("结果", createHelloWorld([{}, null, 42])());
console.log("结果", createHelloWorld([{}, null, 42])());
# 计数器
给定一个整型参数 n,请你编写并返回一个 counter 函数。这个 counter 函数最初返回 n,每次调用它时会返回前一个值加 1 的值 ( n , n + 1 , n + 2 ,等等)。
# 示例 1:
输入:
n = 10
["call","call","call"]
输出:[10,11,12]
解释:
counter() = 10 // 第一次调用 counter(),返回 n。
counter() = 11 // 返回上次调用的值加 1。
counter() = 12 // 返回上次调用的值加 1。
# 示例 2:
输入:
n = -2
["call","call","call","call","call"]
输出:[-2,-1,0,1,2]
解释:counter() 最初返回 -2。然后在每个后续调用后增加 1。
const createCounter = (num) => {
let n = num; //定义函数内全局变量
return function counter() {
return n++; //使全局变量加一
};
};
const counter = createCounter(10);
console.log("结果", counter()); //10
console.log("结果", counter()); //11
console.log("结果", counter()); //12
# 相等还是不相等
请你编写一个名为 expect 的函数,用于帮助开发人员测试他们的代码。它应该接受任何值 val 并返回一个包含以下两个函数的对象。
toBe(val)接受另一个值并在两个值相等( === )时返回true。如果它们不相等,则应抛出错误Not EqualnotToBe(val)接受另一个值并在两个值不相等( !== )时返回true。如果它们相等,则应抛出错误Equal
# 示例 1:
输入:func = () => expect(5).toBe(5)
输出:{"value": true}
解释:5 === 5 因此该表达式返回 true。
# 示例 2:
输入:func = () => expect(5).toBe(null)
输出:{"error": "Not Equal"}
解释:5 !== null 因此抛出错误 "Not Equal".
# 示例 3:
输入:func = () => expect(5).notToBe(null)
输出:{"value": true}
解释:5 !== null 因此该表达式返回 true.
const expect = (value) => ({
toBe: (val) => {
if (val === value) return true;
else throw new Error("Not Equal");
},
notToBe: (val) => {
if (val !== value) return true;
else throw new Error("Equal");
},
});
let func;
let func1;
let func2;
try {
func = expect(5).toBe(5);
} catch (e) {
func = "error";
}
try {
func1 = expect(5).toBe(null);
} catch (e) {
func1 = "error";
}
try {
func2 = expect(5).notToBe(null);
} catch (e) {
func2 = "error";
}
console.log("结果", func);//true
console.log("结果", func1);//error
console.log("结果", func2);//true
# 计数器 II
请你写一个函数 createCounter。这个函数接收一个初始的整数值 init。并返回一个包含三个函数的对象。
这三个函数是:
increment()将当前值加 1 并返回。decrement()将当前值减 1 并返回。reset()将当前值设置为init并返回。
# 示例 1:
输入:init = 5, calls = ["increment","reset","decrement"]
输出:[6,5,4]
解释:
const counter = createCounter(5);
counter.increment(); // 6
counter.reset(); // 5
counter.decrement(); // 4
# 示例 2:
输入:init = 0, calls = ["increment","increment","decrement","reset","reset"]
输出:[1,2,1,0,0]
解释:
const counter = createCounter(0); counter.increment();// 1
counter.increment(); // 2
counter.decrement(); // 1
counter.reset(); // 0
counter.reset(); // 0
提示:
-1000 <= init <= 1000
0 <= calls.length <= 1000
calls[i] 是 “increment”、“decrement” 和 “reset” 中的一个