# 闭包

# 创建 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 Equal
  • notToBe(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” 中的一个

上次更新: 11/3/2023, 11:59:15 AM