该脚本应该具有添加或删除部分的按钮。在该部分中,有一些按钮可以添加或删除一个名为“行”的子部分。我遇到的问题是将行按钮链接到它们创建的部分。即,无论它们属于哪个部分,它们都会在最后创建的部分中添加或删除。所以我尝试将sec
参数添加到mod_row()
,但似乎它始终是s
的当前值,而不是创建按钮时s
的值。< / p>
foo = document.createElement('p');
var bar = document.createElement('button');
bar.setAttribute('type','button');
bar.onclick = function () { mod_row('add',s) };
bar.appendChild(document.createTextNode('add row'));
foo.appendChild(bar);
bar = document.createElement('button');
bar.setAttribute('type','button');
bar.onclick = function () { mod_row('del',s) };
bar.appendChild(document.createTextNode('del row'));
foo.appendChild(bar);
section.appendChild(foo);
foo = document.createElement('div');
foo.setAttribute('id','magic_rows_'+s);
section.appendChild(foo);
function mod_row (mod,sec) {
var row = "blah blah blah";
var magic_rows = document.getElementById('magic_rows_'+sec);
if (mod == 'add') {
var new_p = document.createElement('p');
new_p.setAttribute('id','row'+r);
new_p.innerHTML = row;
magic_rows.appendChild(new_p);
r++;
}
else if (mod == 'del') {
magic_rows.removeChild(magic_rows.lastChild);
r--;
}
}
答案 0 :(得分:1)
在这两个地方你有一个经典的闭包问题:
bar.onclick = function () { mod_row('add', s) };
//...
bar.onclick = function () { mod_row('del', s) };
问题是这两个函数中的s
是指外部作用域中的s
所以当调用点击处理程序时,它们最终会使用任何值s
当外部范围完成时。生成单击处理函数时,需要强制评估s
。通常的方法是使用函数来生成回调函数:
bar.onclick = (function(inner_s) {
return function() {
mod_row('add', inner_s);
}
})(s);
//...
bar.onclick = (function(inner_s) {
return function() {
mod_row('del', inner_s);
}
})(s);
当您分配到s
而不是inner_s
被调用时,额外的功能评估层会强制bar.onclick
进行评估(<{1}}。
即使在声称没有指针的语言中,你也无法摆脱指针的处理。
更新:这里有一个关于时髦的自动执行功能如何工作的说明。这样:
bar.onclick
在功能上等同于:
bar.onclick = (function(inner_s) {
return function() {
mod_row('add', inner_s);
}
})(s);
调用function closure_hack(inner_s) {
return function() {
mod_row('add', inner_s);
}
}
bar.onclick = closure_hack(s);
时,会给出closure_hack
,s
是对某个对象的引用。然后,在s
内,closure_hack
引用inner_s
引用的同一对象。在s
之外,closure_hack
可以更改为引用其他对象,但s
仍然引用旧版本。函数调用 - 通过inner_s
或惯用的自执行函数 - 只是将变量名称closure_hack
与其引用的对象进行离婚的方法:目标是抓住s
指的是s
可以改变而没有不良副作用。
这很棘手,需要一些时间来适应。闭包让每个人都兴奋起来,不要因为有点困惑而感到难过。