2016-03-07 44 views
-2

當執行下面的ViewModel函數時,錯誤未捕獲TypeError:self.deleteInvisibleColumns不是函數被引發 - 這是爲什麼?未定義不是函數使用this和self

function ViewModel(vm) { 
    var self = this; 

    this.rows = ko.observableArray(vm.Rows); 
    self.deleteInvisibleColumns(); 

    this.deleteInvisibleColumns = function() { 
     for (var i = 0; i < vm.Rows.length; i++) { 
      var row = vm.Rows[i]; 

      var keys = Object.keys(row); 
      for (var k = 0; k < keys.length; k++) { 
       if (vm.VisibleColumns.indexOf(keys[k]) === (-1)) { 
        delete row[keys[k]]; 
       }; 
      }; 
     }; 
    }; 
+3

電話定義之前的函數? – Hacketo

+0

您可能會對* hoisting *的工作方式感到困惑......?並非所有的Javascript代碼都是隨機重新排序的。有些事情確實還是按順序執行。 – deceze

+0

Doh!謝謝Hacketo,我忘了Javascript沒有編譯 - C#中太長了! –

回答

1

試試這個:

  1. callint它

  2. 使用 「自我」 兩個函數定義之前刪除函數的定義,把它

    function ViewModel(vm) { 
    
        var self = this; 
    
        this.rows = ko.observableArray(vm.Rows); 
    
        self.deleteInvisibleColumns = function() { 
         for (var i = 0; i < vm.Rows.length; i++) { 
          var row = vm.Rows[i]; 
    
          var keys = Object.keys(row); 
          for (var k = 0; k < keys.length; k++) { 
           if (vm.VisibleColumns.indexOf(keys[k]) === (-1)) { 
           delete row[keys[k]]; 
           }; 
          }; 
         }; 
        }; 
    
        self.deleteInvisibleColumns(); 
    }; 
    
+0

爲什麼定義一個函數然後調用它,何時可以直接使用for循環?否則,您將最終重複定義相同的函數。只需刪除開始內部函數和匹配大括號的行即可。 – diynevala

+0

@diynevala這不是我的代碼。我猜如果羅布鮑曼把這個代碼放在一個函數中,他可能想在另一個地方重用它。 – TamarG

+0

我明白這不是你的代碼。這個函數是不是隻能在ViewModel函數內部訪問,所以它不是真正可重用的(除非在同一個函數中使用)? – diynevala

相關問題