2014-07-01 77 views
1

試圖讓我的頭繞着對象,方法,閉包等...在Javascript中。將變量傳遞給對象方法javascript

看不出爲什麼這不起作用,我想我的思想存在一些根本性缺陷。我期待val變量傳遞給addNote()函數,但事實並非如此。我認爲任何在函數之外聲明的變量都可用於該函數,只要它們不在另一個函數內。這是不正確的?

if(typeof(Storage) !== "undefined") { 
     console.log(localStorage); 

     var $input = $('#input'), 
      $submit = $('#submit'), 
      $list = $('#list'), 
      val = $input.val(); 

     var noteApp = { 

     addNote : function(val) { 
      var item = val.wrap('<li />'); 
      item.appendTo($list); 

      clearField(); 
     }, 

     clearField : function() { 
      $input.val = ''; 
     }, 

     delNote : function(note) { 

     } 

     }; 

     $submit.on('click', function(){ 
     noteApp.addNote(); 
     }); 

    } else { 

    } 

我試圖學習專業人員如何設法讓他們的代碼如此乾淨,簡潔和模塊化。我覺得一個音符應用程序將是一個完美的開始,可惜我被困在第一個障礙...

乾杯。

+0

'addNote:功能(VAL) {...}' 你的'addNote'函數需要一個參數,並且你用none來調用它。您需要調用'noteApp.addNote(val);' –

+0

您可以調用'addNote()',即形式參數val用undefined提供。如果'addNote'被聲明爲'function()',系統會嘗試通過外部作用域來解析出現在其體內的'val'。在你的情況下,它會訪問全局變量'val' – rplantiko

回答

2

有與問題

  1. 定義一個名爲val參數,並調用clearField()對象內部時,不傳遞參數給函數
  2. 代碼的幾個問題字面是this.clearField()
  3. 你」重新只獲得一次價值,而不是每次點擊
  4. val是一個字符串,它沒有wrap方法
  5. $input.val = '';是無效的jQuery

我會清理這樣

var noteApp = { 
    init: function() { 
     if (this.hasStorage) { 
      this.elements().events(); 
     } 
    }, 
    elements: function() { 
     this.input = $('#input'); 
     this.submit = $('#submit'); 
     this.list = $('#list'); 
     return this; 
    }, 
    events: function() { 
     var self = this; 

     this.submit.on('click', function(){ 
      self.addNote(); 
     }); 
    }, 
    hasStorage: (function() { 
     return typeof(Storage) !== "undefined"; 
    })(), 
    addNote: function() { 
     this.list.append('<li>' + this.input.val() + '</li>'); 
     this.clearField(); 
     return this; 
    }, 
    clearField: function() { 
     this.input.val(''); 
    }, 
    delNote : function(note) { 

    } 
} 

FIDDLE

記得調用init方法

$(function() { noteApp.init(); }); 
+0

絕對的輝煌,正是我尋找的答案:)我喜歡你不僅回答問題並解決問題,還給了我完美的建議如何去創建這種JS。我讀過的東西似乎在編寫JS時會教這種方法,所以我只能觀察其他人的代碼,並試着弄清楚爲什麼他們做了他們所做的事情。我仍然在學習基礎知識,這是一個很大的幫助。謝謝! – evu

+0

讀到它,我的頭上浮現出一些問題。你知道任何資源來學習更多關於以這種方式寫js嗎?就像我不確定你使用'this'這個關鍵字,init函數是如何工作的,爲什麼hasStorage沒有(),爲什麼它是一個自調函數等等,我可以問,但是它'很高興能夠從某個地方正確學習,而不會花費你的時間:)再次歡呼。 – evu

1

在您的來電addNote(),不傳遞任何參數爲val,所以這將是undefined

noteApp.addNote(); 
//    ^^ nothing 

傳遞輸入(似乎你想要的jQuery對象沒有因爲字符串值您的通話val.wrap):

noteApp.addNote($input); 

當你在函數聲明val,它的作用範圍是該函數,如果函數調用傳遞了這樣的說法的值纔會被填充。即使你有一個名字相同的名字爲val的變量,它們仍然是有區別的。在函數中對val的任何引用都將引用本地val而不是上面的作用域。