Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/465.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript对象项名称_Javascript_This - Fatal编程技术网

javascript对象项名称

javascript对象项名称,javascript,this,Javascript,This,我有以下javascript代码: var oReg = new Object; oReg.a = {size: 762, content: 0}; oReg.b = {size: 342, content: 0}; //... for (var s in oReg) { oReg[s].set = function(i) { alert('#name of oReg item#: ' + i); } } 其中“#oReg项目名称#”应为a、b等 我想应该是以

我有以下javascript代码:

var oReg = new Object;
oReg.a = {size: 762, content: 0};
oReg.b = {size: 342, content: 0};
//...

for (var s in oReg) {
    oReg[s].set = function(i) {
        alert('#name of oReg item#: ' + i);
    }
}
其中“#oReg项目名称#”应为a、b等

我想应该是以
这个
开头,但我看不出来。

应该是
s
而不是
I
,但不幸的是,它不是那么简单,因为“”的缘故。您必须在每次迭代中创建一个新范围(函数创建范围),以便能够保留对
s
的每个值的引用。否则,setter将始终返回最后一个对象键的值

应使用以下代码执行此操作:

for (var s in oReg) {
    oReg[s].set = (function(key) {
        return function() {
            alert('#name of oReg item#: ' + key);
        }
    }(s));
}

我知道很多人在代码中看到调用
eval
时都会哭,但只有当用户输入时,这才是真正危险的。因此:

var oReg = new Object;
oReg.a = {size: 762, content: 0};
oReg.b = {size: 342, content: 0};

for (var s in oReg) {
    eval("oReg[s].set = function(i){alert('oReg."+s+": ' + i);}");
}

我认为您正在尝试这样做。

您的问题是..?而不是“#oReg项的名称#”应该是“s”,但是您不能写“s”,因为变量不存在于函数本身中,而只存在于loop@andrew变量确实存在于循环之外,但在调用
set
时,它将始终指向最后一个键。非常感谢,问题solved@andrew:别忘了点击旁边的复选标记接受这个答案。“这只在用户输入时才有危险”。。。你是对的,但是避免使用
eval
还有其他原因:它速度慢,编译器更难优化,代码更难维护。接受了注释,我想我今天又学到了一些东西:)取而代之的是bfavaretto的答案。这将在每次迭代时发出警报,并且
set
将针对每个键取消定义。
var oReg = new Object;
oReg.a = {size: 762, content: 0};
oReg.b = {size: 342, content: 0};
//...

for (var s in oReg) {
    oReg[s].set = (function(s) {
        alert('#name of oReg item#: ' + s);
    })(s);
}