2013-04-18 199 views
0

在下面的脚本中,console.log返回正确的值,并且两个警报都会触发。然而,价值未定。将数组值传递给函数

任何想法我做错了什么?

jQuery(document).ready(function(){ 

    jQuery("#customfield_21070").attr('style','width:60px'); 
    jQuery("#customfield_21070").attr('disabled','disabled'); 

    var customfields = [ 
    '#customfield_11070', 
    '#customfield_11071', 
    '#customfield_20071', 
    '#customfield_20072', 
    '#customfield_20073', 
    '#customfield_20074', 
    ]; 

    for(var i=0, len=customfields.length; i<len; i++) { 
     console.log(customfields[i]); 
     jQuery(customfields[i]).keyup(function(){ 
      alert('calculate');//FIRES 
      calculateSum(); 
     }); 
    } 


    function calculateSum() { 

     var sum = 0; 

     alert('value: ' + this.value);//UNDEFINED 

     if(!isNaN(this.value) && this.value.length!=0 && this.id !== "customfield_21070") { 
      sum += parseFloat(this.value); 
     } 

     jQuery("#customfield_21070").val(sum.toFixed(2)); 
    } 

}); 
+1

'this'不引用'calculateSum'中的keyup'd元素。 –

+0

'this'在当前上下文中它在'calculateSum'函数中并没有调用任何东西。 –

回答

1

使用Function.prototype.call()

调用与给定值this并单独提供 参数的函数。

它的第一个参数是thisArg

规定的呼叫乐趣this值。请注意,this可能不是 是该方法看到的实际值:如果该方法是 非严格模式代码中的函数,则null和undefined将被替换为 全局对象,并且原始值将被装箱。

所以,从你的处理函数传递thiscalculateSum像这样:

jQuery(customfields[i]).keyup(function(){ 
    calculateSum.call(this); 
}); 
0

@canon是绝对正确的,以下为他说会解决您的问题。

你可以写可能: -

jQuery(document).ready(function() { 

      jQuery("#customfield_21070").attr('style', 'width:60px'); 
      jQuery("#customfield_21070").attr('disabled', 'disabled'); 

      var customfields = [ 
      '#customfield_11070', 
      '#customfield_11071', 
      '#customfield_20071', 
      '#customfield_20072', 
      '#customfield_20073', 
      '#customfield_20074', 
      ]; 

      for (var i = 0, len = customfields.length; i < len; i++) { 
       jQuery(customfields[i]).keyup(function() { 
        calculateSum(this);//Edited 
       }); 
      } 


      function calculateSum(param) {//Edited 

       var sum = 0; 

       alert('value: ' + param.value);//UNDEFINED 

       if (!isNaN(param.value) && param.value.length != 0 && param.id !== "customfield_21070") {//Edited 
        sum += parseFloat(param.value); 
       } 

       jQuery("#customfield_21070").val(sum.toFixed(2)); 
      } 

     }); 

这反映在您的alert应有的价值。 **Tested**