我正在编写一个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("");
}
答案 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)
如果您展示了两种所需的代码,我们可能会更具体地帮助您。对象通过引用传递,但个别变量不是这样,因此两者都不能具有相同的行为。
我能想到的选择是:
将对象作为参数传递给函数,然后引用obj.value
以更改原始对象的实际值。
将回调函数传递给对该对象进行操作的主函数,然后您可以通过几种不同的方式从同一核心代码设置该值。
将核心功能分解为更小的功能,可以从不同的地方调用,并在操作不同类型的源数据时以不同的方式使用。
编写一个函数,可以从其参数中判断出您传递给它的数据类型并进行相应操作。
对于您的代码示例,这里是您可以通过几种不同方式使用的核心功能:
function makeNum(value){
return(value.match(/\d+(\.\d{1,2})?/g).join(""));
}
x.onfocus = function() {
this.value = makeNum(this.value);
}