當我閱讀到這本書的時候,ES6已經出了,最新的教程應該是JS現代編程。雖然書中仍是舊時的編碼風格,但不妨礙咱們獲取思想。對於書中的代碼,我會按照我本身的理解寫出來。編程
如今你要完成一個表單驗證任務(用戶名,郵箱,密碼)
像下面這樣寫固然沒錯:函數
function checkName() { //驗證姓名 }
但這樣寫存在被別人寫的同名方法覆蓋的風險,你應該把他們放在類裏面this
let CheckObject = { checkName () { //驗證姓名 return this; }, checkEmail () { //驗證郵箱 return this }, } CheckObject.checkName().checkEmail(); /*你也能夠這樣寫 let CheckObject = function () {}; CheckObject.prototype={ checkName:function () { //驗證姓名 }, checkEmail:function () { //驗證郵箱 }, } */
書寫函數儘可能將其封裝在類裏面,由於你在工做中考慮的就不是你一我的寫代碼了,應該要考慮會不會影響到別人。編碼
返回this可讓其鏈式調用,方便咱們的使用。spa
值得一提的是,js裏的this與Java中的不一樣prototype
在JS裏,this可用於任何函數(箭頭函數沒有本身的this),不受限制。它的值在代碼運行時計算出來,取決於上下文。
須要警戒的是像下面這樣調用code
let user = { name: "John", hi() { alert(this.name); } } // 將賦值與方法調用拆分爲兩行 let hi = user.hi; hi(); // 錯誤,由於 this 未定義
你可能會說,這我確定會注意呀。但換成下面這樣你可能就不太容易看出來了對象
let user = { name: "John", hi() { alert(this.name); }, bye() { alert("Bye"); } }; user.hi(); // John(簡單的調用工做正常) // 如今咱們要根據 name 來決定調用 user.hi 仍是 user.bye。 (user.name == "John" ? user.hi : user.bye)(); // 報錯!
爲啥會報錯,由於this在傳的時候沒了,你至關於定義了一個新對象去調用它,它與user是不一樣的,徹底獨立,因此他沒有this。blog
var與let其實大致同樣,但var沒有塊級做用域。什麼意思呢?就是你若是不是在函數裏聲明的變量,那麼他們都是全局變量。用var聲明的變量只有函數做用域與全局做用域。教程
function sayHi() { //等同於在最上面 var phrase phrase = "Hello"; alert(phrase); var phrase; } sayHi(); alert(phrase)//undef 找不到了,函數做用域裏面的看不到了 if(true) { var phrase="Hello" } alert(phrase);//還在