0

我正在编写一个 JS 函数,我想直接与 onfocus 事件一起使用,也可以在另一个函数中使用它。问题是如果我传递函数this,那么我所有的函数代码都需要是field.value。当我在函数中使用它时,这会导致问题,因为传递的变量没有 .value 属性。

然后我的想法是将 this.value 传递给函数,这样我就可以处理传递的数据,无论是字段值还是函数值。但是,现在它不会更改原始字段的值。

有没有解决这个问题的好方法,还是我只需要有两个功能?

这是我的两个不同版本的代码:

// Can't be used with when using onfocus="makeNum(this.value)"
function makeNum(value){
    value = value.match(/\d+(\.\d{1,2})?/g).join("");
}

或者

// Can't be used with a function, but works when using makeNum(this)
function makeNum(field){
    field.value = field.value.match(/\d+(\.\d{1,2})?/g).join("");
}
4

2 回答 2

3

对象通过引用传递,但原语通过值传递。由于this.value它是一个原语(例如字符串或数字),因此当您将其传递给函数时,它将被复制,对其进行的修改仅适用于该函数。

编写函数使其返回一个值,然后将其分配回this.value如下:

this.value = makeNum(this.value);

function makeNum(value){
    return value.match(/\d+(\.\d{1,2})?/g).join("");
}
于 2013-09-13T19:19:37.457 回答
1

如果您展示了所需代码的两种风格,我们可能会提供更具体的帮助。对象是通过引用传递的,但单个变量不是,所以你不能对两者有相同的行为。

我能想到的你的选择是这样的:

  1. 将对象作为参数传递给函数,然后引用obj.value以更改原始对象的实际值。

  2. 将回调函数传递给对对象进行操作的主函数,然后您可以通过几种不同的方式从同一核心代码设置值。

  3. 将您的核心功能分解为更小的功能,这些功能可以从不同的地方调用,并在对不同类型的源数据进行操作时以不同的方式使用。

  4. 编写一个函数,该函数可以从其参数中判断您传递给它的数据类型并进行相应操作。

对于您的代码示例,这是您可以通过几种不同方式使用的核心函数:

function makeNum(value){
    return(value.match(/\d+(\.\d{1,2})?/g).join(""));
}

x.onfocus = function() {
    this.value = makeNum(this.value);
}
于 2013-09-13T19:16:46.327 回答