Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/433.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_Function_Parameters_This - Fatal编程技术网

Javascript';这';作为参数

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

我正在尝试将值从“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 (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
是“绑定”的