MVC: Model View Controller
如何解決程式碼寫了就忘
寫完的程式碼過了一週就忘記是幹嘛的了。
那就是用使用MVC!
M :model 模組化
告訴程式,你的資料有哪些操作。
V :view 使用者看得見的東西
顧名思義,view就是檢視。告訴程式,你的程式碼在哪一塊。
C :controller 控制器
controller 負責其他的所有程式碼。
MVC的操作就是:
js檔案中:
!function(){ // 為什麼用 !function(){}.call()
var view = document.querySelector('html中view對應的部分') // 把html的view傳到這裡的view
var model = { // 所有對資料的操作都放在model裡
init: function(){},
fetch: function(){},
save: function(){},
···: ···
}
var controller = { // 創造一個controller對view進行操作
view: null, // 先宣告view
xxxx: xxxx, // 其餘的按照需求增加
init: function(view){
this.view = view // 1.請問這裡的this是誰?
this.bindEvents()
// this.bindEvents.call(this)
},
bindEvents: function(){
window.addEventListener('onclick',function(){
this.active // 2.請問這裡的this是誰?
}.bind(this)
},
active: function(){},
···: ···,
}
controller.init(view)
// controller.init.call(controller,view)
}.call()
複製程式碼
MVC描述:
-
MVC是一種組織形式,它不是任何一種框架,也不是任何一種技術,它就是一種組織程式碼的思想。
-
它宣告一個view,代表這個js檔案操作的html是哪一部分。
-
model是包含所有關於資料的操作,比如獲得資料,初始化資料等。
-
controller是一個物件,物件裡有很多鍵值對,把重要的屬性(比如view)和重要的操作(比如init、bindEvents)作為controller的屬性寫進去,這樣我們對view的操作一目瞭然。
-
對於單一的檔案可能這樣做看起來比直接寫麻煩,但是對於多個JS檔案,使用MVC結構是極大的優化。
如圖描述:
controller監聽view,當使用者點選了view,controller就呼叫model,model向server發請求,server返回響應給model,model把資料返回給controller,controller更新view。
程式碼中提出了幾個問題
- 為什麼使用
!function(){}.call()
- 請問這裡的
this
是誰?
如果你都知道答案,說明你對閉包、立即執行函式有了一定的瞭解。
如果你不知道,請繼續往下看。
1. 為什麼使用 !function(){}.call()
如何使用立即執行函式
- 我們不想要全域性變數
- 我們要使用區域性變數
- ES 5 裡面,只有函式有區域性變數
- 於是我們宣告一個 function xxx,然後 xxx.call()
- 這個時候 xxx 是全域性變數(全域性函式)
- 所以我們不能給這個函式名字
- function(){}.call()
- 但是 Chrome 報錯,語法錯誤
- 試出來一種方法可以不報錯:
第一種方法
!function(){}.call()
我們不在乎這個匿名函式的返回值,所以加個 ! 取反沒關係
第二種方法:
(function(){}).call()
不推薦
如果有人手賤在這種方法的上一行寫了個xxx,如下
xxx
(function(){}).call()
這樣瀏覽器就會認為是xxx(function(){}).call(),就會報錯
第三種方法:
xxxx12312542435423123.call()
不推薦
所以就用第一種方法最好啦!
複製程式碼
如何使用閉包
- 立即執行函式使得 person 無法被外部訪問
- 閉包使得匿名函式可以操作 person
- window.frankGrowUp 儲存了匿名函式的地址
- 任何地方都可以使用 window.frankGrowUp
=>
任何地方都可以使用 window.frankGrowUp 操作 person,但是不能直接訪問 person
(此處有個例子)
2. 請問這裡的this
是誰?
程式碼中已經有所註釋,還看不明白就使用.call()
,把this寫出來。
可以簡單的理解,如果一個物件.call(),那麼this就指向這個物件。