《JavaScript設計模式》讀書筆記(一)——函數怎麼寫纔好

  當我閱讀到這本書的時候,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

在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

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);//還在
相關文章
相關標籤/搜索