模块化
各种全局变量
12345678var $topbar = $('#topbar')$topbar.on('click',functuion(){console.log('topbar')})var $banners = $('#banners')$banners.on('click',function(){console.log('banners')})用立即执行函数消除全局变量(或者用{}块级作用域+let)
12345678910111213141516171819!function(){var $topbar = $('#topbar')$topbar.on('click',functuion(){console.log('topbar')})}() //让这些变量变成局部变量,放进一个函数里并且调用,但是函数前要加上一个符号(+,-,!等)!function(){var $banners = $('#banners')$banners.on('click',functuion(){console.log('banners')})}()------------------{let $topbar = $('#topbar')$topbar.on('click',functuion(){console.log('topbar')})} //或者用es6语法:块级作用域,局部变量按照上述方法,作用域与作用域之间是隔开的,如果作用域B想使用作用域A的变量,怎么办?可以使用两个作用域都能访问到的全局变量window,作为桥梁,赋值给window属性并访问
123456789101112!function(){var $topbar = $('#topbar')var user = {name:'yom',age:20}window.user = user //全局变量}()!function(){console.log(window.user)}()如果不能让别的作用域改user,只能读(暴露一个函数,不要暴露整个变量)
123456789101112131415!function(){var $topbar = $('#topbar')var user = {name:'yom',age:20}window.user = {nameGetter:function(){return user.name},ageGetter:fucntion(){return user.age}}}()!function(){console.log(window.user.nameGetter) //yom}()什么时候闭包:只要一个函数使用了它外面的变量,这个函数就是闭包,闭包是指这个函数以及它能访问到的这个变量。闭包是作用域的一种特殊的使用方式。
举例:年龄增长器
1234567891011function olderMaker(){var user = {name:'jack',age:18}return function(){user.age += 1}}var older = olderMaker() //函数older.call() 每call一下,年龄增加一岁