在javascript函数中设置常量
请看下面的代码:在javascript函数中设置常量,javascript,function,variables,Javascript,Function,Variables,请看下面的代码: var arr = new Array(); for (var i = 0; i < 10; i++) { arr[i] = { func:function() { console.log(i); } } } arr[0].func(); var arr=new Array(); 对于(变量i=0;i
var arr = new Array();
for (var i = 0; i < 10; i++) {
arr[i] = {
func:function() {
console.log(i);
}
}
}
arr[0].func();
var arr=new Array();
对于(变量i=0;i<10;i++){
arr[i]={
func:function(){
控制台日志(i);
}
}
}
arr[0].func();
我对此感到困惑,因为我认为这会奏效。基本上,我希望数组中的每个对象打印创建函数时所给的值。
现在,当我调用
func()
时,它会在控制台中打印10。有没有办法让它打印0,1,2,3,4,5,6,7,8,9
?谢谢 问题在于内部函数引用的变量“i”每次都会增加。在对象中的每次迭代中,可以将“i”的值与函数一起存储,如下所示:
var arr=new Array();
对于(变量i=0;i<10;i++){
arr[i]={
func:function(){
console.log(this.value);
},
价值:i
}
}
arr[0].func();
问题在于,内部函数引用的变量“i”每次都会增加。在对象中的每次迭代中,可以将“i”的值与函数一起存储,如下所示:
var arr=new Array();
对于(变量i=0;i<10;i++){
arr[i]={
func:function(){
console.log(this.value);
},
价值:i
}
}
arr[0].func();
您必须创建一个闭包来封装该值。我在这里调用consoleIt
并将其传递给I
consoleIt
在i
var arr = [];
function consoleIt (i) {
return function () {
console.log(i);
}
};
for (var i = 0; i < 10; i++) {
arr[i] = {
func: consoleIt(i)
};
}
arr[0].func();
var arr=[];
功能控制台(一){
返回函数(){
控制台日志(i);
}
};
对于(变量i=0;i<10;i++){
arr[i]={
func:consoleIt(一)
};
}
arr[0].func();
您必须创建一个闭包来封装该值。我在这里调用consoleIt
并将其传递给I
consoleIt
在i
var arr = [];
function consoleIt (i) {
return function () {
console.log(i);
}
};
for (var i = 0; i < 10; i++) {
arr[i] = {
func: consoleIt(i)
};
}
arr[0].func();
var arr=[];
功能控制台(一){
返回函数(){
控制台日志(i);
}
};
对于(变量i=0;i<10;i++){
arr[i]={
func:consoleIt(一)
};
}
arr[0].func();
这实际上并不比Breiflab的做法好多少,但这是一项值得了解的有趣技术:
var arr = [];
for (var i = 0; i < 10; i++){
(function(i){
arr[i] = {
func : function(){
console.log(i);
}
};
})(i);
}
arr[0].func();
var arr=[];
对于(变量i=0;i<10;i++){
(职能(一){
arr[i]={
func:function(){
控制台日志(i);
}
};
})(i) );
}
arr[0].func();
它只是使用一个匿名闭包来定义范围i。这实际上并不比Breiflab的做法好多少,但这是一种值得了解的有趣技术:
var arr = [];
for (var i = 0; i < 10; i++){
(function(i){
arr[i] = {
func : function(){
console.log(i);
}
};
})(i);
}
arr[0].func();
var arr=[];
对于(变量i=0;i<10;i++){
(职能(一){
arr[i]={
func:function(){
控制台日志(i);
}
};
})(i) );
}
arr[0].func();
它只是对范围i使用匿名闭包。是的,这是一个闭包问题。请,请,将此作为副本关闭。另一个:是的,这是一个闭包问题。请,请,将此作为副本关闭。另一个: