JavaScript 闭包嵌套函数
JavaScript Closures Nested Function
每次我调用这个函数a()
,我都想得到输出作为第一个参数的平方。我应该如何将 i
的值设为常量,因为每次在函数调用时它都会被重新分配为零。
要求输出为 9,9,9 即。第一个参数是 3
function a(k) {
i = 0
function b() {
if (i == 0) {
k = k * k
console.log(k)
console.log(i)
i++
}
}
b()
}
a(3)
a(4)
a(5)
你走在正确的轨道上,如果是第一次,你需要保持跟踪,但如果是下一次,你什么也没做。您可以像现在一样继续使用全局变量,如果有值,则 return 它。这里的问题是使用全局不是最好的做法。
var prevValue = null;
function a(k) {
if (prevValue === null) {
prevValue = k * k
return prevValue;
} else {
return prevValue;
}
}
console.log(a(3));
console.log(a(4));
console.log(a(5));
另一种方法是重写函数,使其在您第一次调用后成为不同的函数。这里的问题是函数必须是可访问的,所以你可以覆盖它。
function a(k) {
var prevValue = k * k;
a = function () {
return prevValue;
}
return prevValue;
}
console.log(a(3));
console.log(a(4));
console.log(a(5));
最好以没有全局变量的方式定义函数。它将封装变量以便它可以被函数读取而不是放在全局范围内。
var a = (function (){
var prevValue = null
return function(k) {
if (prevValue === null) {
prevValue = k * k;
return prevValue;
} else {
return prevValue;
}
};
}());
console.log(a(3));
console.log(a(4));
console.log(a(5));
您需要通过使用 let
定义 i
来将其限定在 a
函数内,否则定义 i
是相同的window.i = 0
使其成为 全局 变量,因此,即使在 a
函数执行结束后,它仍保持其值。
function a(k) {
let i = 0
function b() {
if (i == 0) {
k = k * k
console.log(k)
console.log(i)
i++
}
}
b()
}
a(3)
a(4)
a(5)
每次我调用这个函数a()
,我都想得到输出作为第一个参数的平方。我应该如何将 i
的值设为常量,因为每次在函数调用时它都会被重新分配为零。
要求输出为 9,9,9 即。第一个参数是 3
function a(k) {
i = 0
function b() {
if (i == 0) {
k = k * k
console.log(k)
console.log(i)
i++
}
}
b()
}
a(3)
a(4)
a(5)
你走在正确的轨道上,如果是第一次,你需要保持跟踪,但如果是下一次,你什么也没做。您可以像现在一样继续使用全局变量,如果有值,则 return 它。这里的问题是使用全局不是最好的做法。
var prevValue = null;
function a(k) {
if (prevValue === null) {
prevValue = k * k
return prevValue;
} else {
return prevValue;
}
}
console.log(a(3));
console.log(a(4));
console.log(a(5));
另一种方法是重写函数,使其在您第一次调用后成为不同的函数。这里的问题是函数必须是可访问的,所以你可以覆盖它。
function a(k) {
var prevValue = k * k;
a = function () {
return prevValue;
}
return prevValue;
}
console.log(a(3));
console.log(a(4));
console.log(a(5));
最好以没有全局变量的方式定义函数。它将封装变量以便它可以被函数读取而不是放在全局范围内。
var a = (function (){
var prevValue = null
return function(k) {
if (prevValue === null) {
prevValue = k * k;
return prevValue;
} else {
return prevValue;
}
};
}());
console.log(a(3));
console.log(a(4));
console.log(a(5));
您需要通过使用 let
定义 i
来将其限定在 a
函数内,否则定义 i
是相同的window.i = 0
使其成为 全局 变量,因此,即使在 a
函数执行结束后,它仍保持其值。
function a(k) {
let i = 0
function b() {
if (i == 0) {
k = k * k
console.log(k)
console.log(i)
i++
}
}
b()
}
a(3)
a(4)
a(5)