Javascript 带函数的闭包是如何工作的?
How does the Javascript closure with function works?
嗨,我一直在探索闭包和 javascript 核心概念,我不明白为什么 console.log(factory[i]) 输出未定义,我已经将我的函数推到里面了,对吗?如果我在循环外调用 temp 它说未定义,而如果我在循环内调用它 returns 我有点困惑谁能解释我吗?这是我的代码
var fruits=["apple","orange"];
var factory=[];
for(var i=0;i<fruits.length;i++)
{
var temp=function()
{
console.log(fruits[i]);
}
factory.push(temp());
}
temp();
console.log(factory);
for(var i=0;i<factory.length;i++)
{
temp(i);
console.log(factory[i]);
}
这是您的输出。
//next two executed due to factory.push(temp()) in first if loop
& there is a console.log there inside the function
apple
orange
//here i++ in first loop will be 3, but array have only two element, so it is undefined
undefined
// due to console.log(factory)
// temp function is actually returning undefined,
[undefined, undefined]
// due to temp(i) in second if block
apple
// but factory array is stil empty so factory[i] will be undefined
undefined
from temp orange
undefined
您传递的不是函数,而是执行函数 temp() 的结果,因为它没有 return 任何未定义的东西。 change factory.push(temp()); to factory.push(temp);
return 之外的 temp() 未定义,因为到那时循环已经执行并且 i 的值为 2
检查以下记录 i 值的代码.
var fruits=["apple","orange"];
var factory=[];
for(var i=0;i<fruits.length;i++)
{
var temp=function()
{
console.log(fruits[i],"console",i);
}
factory.push(temp);
}
temp();
console.log(factory,"factory");
for(var i=0;i<factory.length;i++)
{
temp(i); //i resets to 0 here in same scope
console.log(factory[i](i),"factoryi"); //this doesnt return anything so its undefined but statements are executed
}
闭包只不过是保存数据的函数。到目前为止,一个函数被视为和平代码,它接受输入并产生一些输出,对于每个函数调用,此代码保持不变,但闭包让您有机会使用可以更改的函数保存一些数据,以便每个函数调用它会有不同的反应,请记住,一切都会很容易。
假设你有一个找到利率的函数,但是这个函数被三个利率不同的团队使用,所以通常我们所做的是我们每次都传递团队名称和本金金额必须传递团队名称,所以通过使用闭包我们可以为每个团队创建一个函数的三个实例(团队名称作为保留数据),现在只发送本金金额并获得根据团队计算的利息,我一会儿还将添加示例,
嗨,我一直在探索闭包和 javascript 核心概念,我不明白为什么 console.log(factory[i]) 输出未定义,我已经将我的函数推到里面了,对吗?如果我在循环外调用 temp 它说未定义,而如果我在循环内调用它 returns 我有点困惑谁能解释我吗?这是我的代码
var fruits=["apple","orange"];
var factory=[];
for(var i=0;i<fruits.length;i++)
{
var temp=function()
{
console.log(fruits[i]);
}
factory.push(temp());
}
temp();
console.log(factory);
for(var i=0;i<factory.length;i++)
{
temp(i);
console.log(factory[i]);
}
这是您的输出。
//next two executed due to factory.push(temp()) in first if loop
& there is a console.log there inside the function
apple
orange
//here i++ in first loop will be 3, but array have only two element, so it is undefined
undefined
// due to console.log(factory)
// temp function is actually returning undefined,
[undefined, undefined]
// due to temp(i) in second if block
apple
// but factory array is stil empty so factory[i] will be undefined
undefined
from temp orange
undefined
您传递的不是函数,而是执行函数 temp() 的结果,因为它没有 return 任何未定义的东西。
change factory.push(temp()); to factory.push(temp);
return 之外的 temp() 未定义,因为到那时循环已经执行并且 i 的值为
2
检查以下记录 i 值的代码.
var fruits=["apple","orange"];
var factory=[];
for(var i=0;i<fruits.length;i++)
{
var temp=function()
{
console.log(fruits[i],"console",i);
}
factory.push(temp);
}
temp();
console.log(factory,"factory");
for(var i=0;i<factory.length;i++)
{
temp(i); //i resets to 0 here in same scope
console.log(factory[i](i),"factoryi"); //this doesnt return anything so its undefined but statements are executed
}
闭包只不过是保存数据的函数。到目前为止,一个函数被视为和平代码,它接受输入并产生一些输出,对于每个函数调用,此代码保持不变,但闭包让您有机会使用可以更改的函数保存一些数据,以便每个函数调用它会有不同的反应,请记住,一切都会很容易。
假设你有一个找到利率的函数,但是这个函数被三个利率不同的团队使用,所以通常我们所做的是我们每次都传递团队名称和本金金额必须传递团队名称,所以通过使用闭包我们可以为每个团队创建一个函数的三个实例(团队名称作为保留数据),现在只发送本金金额并获得根据团队计算的利息,我一会儿还将添加示例,