Javascript';这';作为参数
我正在尝试将值从“from”字段复制到“to”字段。我的第一次尝试是:Javascript';这';作为参数,javascript,function,parameters,this,Javascript,Function,Parameters,This,我正在尝试将值从“from”字段复制到“to”字段。我的第一次尝试是: function updateToField(toField,fromField) { toField.value = fromField.value} } function verifyFromToFields() { var inputs = getElementsByTagName("input"); for (var j = 0; j < inputs.length; j++) { if (i
function updateToField(toField,fromField)
{
toField.value = fromField.value}
}
function verifyFromToFields()
{
var inputs = getElementsByTagName("input");
for (var j = 0; j < inputs.length; j++)
{
if (inputs[j].name.indexOf('FROM') != -1 && if (inputs[j+1].name.indexOf('TO') != -1)
{
var fromField = inputs[j];
var toField = inputs[j+1];
fromField.onchange = function(){updateToField(toField,fromField)};
}
}
函数updateToField(toField,fromField)
{
toField.value=fromField.value}
}
函数verifyFromToFields()
{
var inputs=getElementsByTagName(“输入”);
对于(var j=0;j
该网站有几个从到对,这似乎只适用于“输入”数组中的最后一对
然后我试了一下:
function updateToField(toField,fromField)
{
toField.value = fromField.value}
}
function verifyFromToFields()
{
var inputs = getElementsByTagName("input");
for (var j = 0; j < inputs.length; j++)
{
if (inputs[j].name.indexOf('FROM') != -1 && if (inputs[j+1].name.indexOf('TO') != -1)
{
var fromField = inputs[j];
var toField = inputs[j+1];
fromField.onchange = function(){updateToField(toField,this)};
}
}
函数updateToField(toField,fromField)
{
toField.value=fromField.value}
}
函数verifyFromToFields()
{
var inputs=getElementsByTagName(“输入”);
对于(var j=0;j
这样,当页面中的任何“发件人”字段被修改时,它会被复制到页面上的最后一个“收件人”字段。我认为这是我读到的关于参数作为值或引用的问题之一,但我无法理解。
另外,这是一个非常简化的代码版本,我实际上用一个getElementsByClass函数填充输入列表,并且必须通过childnodes进行搜索。
有人知道发生了什么吗?问题实际上与作用域有关。发生的是您的函数(您分配给
的函数)发生了变化正在捕获变量toField
和fromField
,并且它们的值不断变化。我知道,看起来您每次通过循环都会重新声明它们,但JS不是这样工作的;通过循环的连续行程共享一个范围,因此fromField
每次都是同一个变量,您只是在在每次迭代中为它指定一个新值。因此,在最后,所有函数都引用相同的fromField
变量。该fromField
变量自然包含您为其指定的最后一个值
因此,当您最终调用所有这些函数时,它们都执行相同的操作,因为它们的fromField
s(以及,按照相同的逻辑,toField
s)都是相同的变量。这就解释了为什么只有最后的输入起作用;它们是运行函数时包含的fromField
和toField
你可以通过引入一个中间函数来解决这个问题,因为函数确实会创建新的作用域。这样每次通过循环,你都会得到全新的变量
function updateToField(toField,fromField)
{
toField.value = fromField.value;
}
function verifyFromToFields()
{
var inputs = getElementsByTagName("input");
for (var j = 0; j < inputs.length; j++)
{
function(){
if (inputs[j].name.indexOf('FROM') != -1 && if (inputs[j+1].name.indexOf('TO') != -1)
{
var fromField = inputs[j];
var toField = inputs[j+1];
fromField.onchange = function(){updateToField(toField,fromField)};
}
}();
}
函数updateToField(toField,fromField)
{
toField.value=fromField.value;
}
函数verifyFromToFields()
{
var inputs=getElementsByTagName(“输入”);
对于(var j=0;j
这个结尾,我不认为它意味着你认为它意味着什么
这一行在这里:
fromField.onchange = function(){updateToField(toField,this)};
表示“分配给onchange
一个函数,该函数将该字段的内容分配给更改时的toField
中的任何内容
由于您只有一个变量toField
,所有可变字段都将分配给它
这将有助于:
var setOnChange = function(fromField, toField) {
fromField.onchange = function(){updateToField(toField,this)};
};
for (var j = 0; j < inputs.length; j++)
{
if (inputs[j].name.indexOf('FROM') != -1 && if (inputs[j+1].name.indexOf('TO') != -1)
{
setOnChange(inputs[j], inputs[j+1]);
}
}
var setOnChange=函数(fromField,toField){
fromField.onchange=function(){updateToField(toField,this)};
};
对于(var j=0;j
EDIT:Isaac可能对这个问题有更好的解释(尽管我不太喜欢他的解决方案)。这是因为闭包是如何工作的。当你分配你创建的onchange
函数时(对于每个循环)一个新的匿名函数调用updateToField
,但是toField
和this
参数(或您正在传递的任何其他参数)的值不会绑定到“当前”循环,而是将参数绑定到循环的最后一个值(这就是只使用最后一个“to”的原因)
不要将新函数分配给onchange
属性,而是尝试调用函数。如果您在具有该函数的环境中运行,请绑定该函数;如果您没有该函数,请编写该函数
所以你可以这样说:
fromField.onchange = updateToField.bind(this, fromField, toField);
或者你也可以使用写过的另一种方法。与此无关,通过引用传递:与闭包相关更多。@kojiro——这是个好建议,但是,纯属偶然,闭包(而不是这个)正是让他现在陷入困境的原因!@Malvolio,我就是这么说的。:)@kojiro——我完全误解了你的意思:我以为你是在建议他使用闭包而不是this
,我认为这是一个好建议,尽管在这里它会让事情变得更糟,而不是更好。@Malvolio,如果有一个合理的方法来附加字段之间的关系($(fromfield)。数据(“tofield”)“,tofield)
)如果不使用jQuery,使用this
将变得非常简单。关于tofield
您所说的绑定到当前值是正确的,但是关于this
this
它从来没有词汇范围,它总是(有效地)是的,您完全正确,但是参数fromField
和toField
是“绑定”的