什麼是Closure? 它在JavaScript中的作用是什麼?
如何在JavaScript中創建一個Closure?可以舉一個實際的例子嗎?
Closer的作用域是什麼?它如何影響功能內變量的作用域?
什麼時候應該使用Closure,而不是其他的函數?
如果Closure導致內存洩露,你怎麼解決這個問題?
Closure是一種函數,它捕獲對外部變量的引用,當函數在外部被調用時,它可以訪問這些變量。簡而言之,closure是一個包含函數定義和指向它捕獲的變量的一個環境的對象。
下面是一個closure的示例代碼:
def outer_func(x):
def inner_func(y):
return x + y
return inner_func
closure = outer_func(10)
result = closure(5)
print(result) # 15
在這個示例中,outer_func返回了inner_func,inner_func可以訪問outer_func中的變量x。在調用outer_func時傳遞的參數x是10,並且在之後將其捕獲在closure中。當closure被調用時,inner_func可以訪問x的值,並且將其加上將來傳遞的y值。在此示例中,closure的結果是15(即10 + 5)。
總的來說,closures是一種強大的python特性,可以使程序更加靈活和可讀性。它們可以捕獲變量,讓函數更加通用和易於重複使用。
答案:
function createElement(tag) {
return function(content) {
var element = document.createElement(tag);
element.textContent = content;
return element;
}
}
var createH1 = createElement("h1");
var heading = createH1("Hello World");
document.body.appendChild(heading);
答案:
function powerFunc(base) {
return function(exponent) {
return Math.pow(base, exponent);
}
}
var square = powerFunc(2);
console.log(square(3)); // 8
function add(a, b, c) {
return a + b + c;
}
var curriedAdd = curry(add);
curriedAdd(1)(2)(3) // 6
答案:
function curry(func) {
return function curried(...args) {
if (args.length >= func.length) {
return func.apply(null, args);
} else {
return function(...args2) {
return curried.apply(null, args.concat(args2));
}
}
};
}
var add = function (a, b, c) {
return a + b + c;
};
var curriedAdd = curry(add);
console.log(curriedAdd(1)(2)(3)); // 6
function asyncTask1(callback) {
console.log('asyncTask1');
callback();
}
function asyncTask2(callback) {
console.log('asyncTask2');
callback();
}
function asyncTask3(callback) {
console.log('asyncTask3');
callback();
}
sequence(asyncTask1, asyncTask2, asyncTask3, function() {
console.log('done!');
});
输出结果:
asyncTask1
asyncTask2
asyncTask3
done!
答案:
function sequence(...tasks) {
const last = tasks.pop();
function handleCallbacks(tasks, callback) {
const task = tasks.shift();
if (typeof task === 'function') {
task(function() {
handleCallbacks(tasks, callback);
});
} else {
callback();
}
}
handleCallbacks(tasks.slice(), last);
}
const keyValues = createKeyValueStore();
keyValues('name', 'John');
keyValues('age', 30);
// 控制台输出:
// { name: 'John' }
// { name: 'John', age: 30 }
答案:
function createKeyValueStore() {
const keyValueStore = {};
return function(key, value) {
keyValueStore[key] = value;
console.log(keyValueStore);
}
}
const keyValues = createKeyValueStore();
keyValues('name', 'John');
keyValues('age', 30);