将this.value传递给JS中的函数,然后更改该值

时间:2013-09-13 19:13:04

标签: javascript html

我正在编写一个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("");
}

OR

// 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("");
}

2 个答案:

答案 0 :(得分:3)

Objects are passed by reference, but primitives are passed by value。由于this.value是一个原语(例如一个字符串或数字),因此在将它传递给函数时会复制它,对它的修改只会应用该函数。

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

this.value = makeNum(this.value);

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

答案 1 :(得分:1)

如果您展示了两种所需的代码,我们可能会更具体地帮助您。对象通过引用传递,但个别变量不是这样,因此两者都不能具有相同的行为。

我能想到的选择是:

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

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

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

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

  5. 对于您的代码示例,这里是您可以通过几种不同方式使用的核心功能:

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