如何在使用javascript创建对象时执行函数?

如何在使用javascript创建对象时执行函数?,javascript,jquery,Javascript,Jquery,如何在使用javascript创建对象时执行函数 运行以下代码 var y = [] ; var x = [[1,2,3] , [4,5,6] , [7,8,9]] for (var i = 0 ; i < 3 ; i++){ y.push({name :'MyName' , value:function(){return x[i]} }) ; } console.log(y) ; 问题 如何执行具有以下内容的对象函数: {name : 'MyName' ,

如何在使用javascript创建对象时执行函数

运行以下代码

 var y = [] ;
 var x = [[1,2,3] , [4,5,6] , [7,8,9]]
 for (var i = 0 ; i < 3 ; i++){
     y.push({name :'MyName' , value:function(){return x[i]} }) ; 
 }

 console.log(y) ;  
问题

如何执行具有以下内容的对象函数:

{name : 'MyName' , value : function (){return [1,2,3]}
我尝试了
eval()
但没有成功

这是我的

那些问你为什么要这样做的人?
我这样做是因为对象将被值复制,所以我最终将所有的me
object.value
都等于X[2]

这是一段奇怪的代码。我不知道你想达到什么目的。 但是您遇到的问题是,
i
在整个循环中递增。因此,当最终调用函数时,
i
的值为3,因此超出了
x
数组的边界。 您可以这样修复它:

var y = [] ;
var x = [[1,2,3] , [4,5,6] , [7,8,9]]
for (var i = 0 ; i < 3 ; i++){
    y.push({
        name :'MyName',
        index: i,
        value:function(){return x[this.index]; } 
    }) ; 
}

console.log(y[0].value()); 
var y=[];
变量x=[[1,2,3],[4,5,6],[7,8,9]]
对于(变量i=0;i<3;i++){
y、 推({
姓名:'MyName',
索引:i,,
值:函数(){return x[this.index];}
}) ; 
}
console.log(y[0].value());
或者,如果您不明确需要函数来执行:

var y = [] ;
var x = [[1,2,3] , [4,5,6] , [7,8,9]]
for (var i = 0 ; i < 3 ; i++){
    y.push({
        name :'MyName',
        value: x[i]
    }) ; 
}

console.log(y[0].value); 
var y=[];
变量x=[[1,2,3],[4,5,6],[7,8,9]]
对于(变量i=0;i<3;i++){
y、 推({
姓名:'MyName',
值:x[i]
}) ; 
}
console.log(y[0].值);

要成功地将这些对象添加到数组中,需要在y.push()语句上创建闭包。闭包将确保变量x[i]在被调用时对value()函数可用

下面的代码定义了“addItem()”函数,该函数关闭创建自包含环境的对象的“value()”函数。这意味着即使在“addItem()”函数完成之后,“value()”函数仍然可以访问在“addItem()”函数中定义或传递的变量

var i = 0
var y = [] ;
var x = [[1,2,3] , [4,5,6] , [7,8,9]];

function addItem(item) {
    y.push({
        name: 'MyName', 
        value: function () {
            return item;
        }
    });
}

for ( ; i < 3 ; i++) {
    addItem(x[i]);
}

console.log(y);
/*
[ { name: 'MyName', value: [Function] },
  { name: 'MyName', value: [Function] },
  { name: 'MyName', value: [Function] } ]
*/
console.log(y[0].value()); // [1, 2, 3]
console.log(y[1].value()); // [4, 5, 6]
console.log(y[2].value()); // [7, 8, 9]
var i=0
变量y=[];
var x=[[1,2,3],[4,5,6],[7,8,9];
功能附加项(项目){
y、 推({
姓名:'我的姓名',
值:函数(){
退货项目;
}
});
}
对于(;i<3;i++){
增补项(x[i]);
}
控制台日志(y);
/*
[{name:'MyName',value:[函数]},
{name:'MyName',值:[Function]},
{name:'MyName',value:[函数]}]
*/
console.log(y[0].value());//[1, 2, 3]
console.log(y[1].value());//[4, 5, 6]
console.log(y[2].value());//[7, 8, 9]

您也可以在循环中使用匿名函数来实现同样的功能,但我选择不这样做,因为这样会在每次执行for循环时创建一个新函数。

javascript将为您维护该上下文,除非您覆盖
x
我真的不明白,为什么您需要函数,为什么不干脆
y.push({name:'MyName',value:x[i]})?因为对象是按值复制的,所以所有的值都将等于x[2]可能的重复,比如索引和this.index
var i = 0
var y = [] ;
var x = [[1,2,3] , [4,5,6] , [7,8,9]];

function addItem(item) {
    y.push({
        name: 'MyName', 
        value: function () {
            return item;
        }
    });
}

for ( ; i < 3 ; i++) {
    addItem(x[i]);
}

console.log(y);
/*
[ { name: 'MyName', value: [Function] },
  { name: 'MyName', value: [Function] },
  { name: 'MyName', value: [Function] } ]
*/
console.log(y[0].value()); // [1, 2, 3]
console.log(y[1].value()); // [4, 5, 6]
console.log(y[2].value()); // [7, 8, 9]