写完的代码过了一周就忘记是干吗的了。
那就是用使用MVC!html
告诉程序,你的数据有哪些操做。浏览器
顾名思义,view就是视图。告诉程序,你的代码在哪一块。bash
controller 负责其余的全部代码。闭包
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是一种组织形式,它不是任何一种框架,也不是任何一种技术,它就是一种组织代码的思想。框架
它声明一个view,表明这个js文件操做的html是哪一部分。模块化
model是包含全部关于数据的操做,好比得到数据,初始化数据等。函数
controller是一个对象,对象里有不少键值对,把重要的属性(好比view)和重要的操做(好比init、bindEvents)做为controller的属性写进去,这样咱们对view的操做一目了然。fetch
对于单一的文件可能这样作看起来比直接写麻烦,可是对于多个JS文件,使用MVC结构是极大的优化。
优化
!function(){}.call()
this
是谁?若是你都知道答案,说明你对闭包、当即执行函数有了必定的了解。
若是你不知道,请继续往下看。ui
!function(){}.call()
第一种方法
!function(){}.call()
咱们不在意这个匿名函数的返回值,因此加个 ! 取反不要紧
第二种方法:
(function(){}).call()
不推荐
若是有人手贱在这种方法的上一行写了个xxx,以下
xxx
(function(){}).call()
这样浏览器就会认为是xxx(function(){}).call(),就会报错
第三种方法:
xxxx12312542435423123.call()
不推荐
因此就用第一种方法最好啦!
复制代码
=>
任何地方均可以使用 window.frankGrowUp 操做 person,可是不能直接访问 person
(此处有个例子)
this
是谁?代码中已经有所注释,还看不明白就使用.call()
,把this写出来。 能够简单的理解,若是一个对象.call(),那么this就指向这个对象。