coffeescript 函數 箭頭表達式

函數

  • do能夠造成閉包,使方法做用域不受外部變化的影響。
  • 隱式返回最後一個表達式的值
  • 函數調用省略括號
  • arguments數組訪問傳遞給函數的全部對象(低可讀性)

@namethis.name的簡寫,this表示上下文環境。相應的,有new關鍵字,applycall方法。node

  • 函數調用前如有new關鍵字,會把函數做爲構造函數建立一個新對象,上下位即爲該新對象。
  • 使用call或者apply調用函數時,給定的第一個參數爲上下文。
  • 函數做爲對象的屬性obj.func來調用時,該對象爲上下文。
  • 若不知足以上條件,則上下文爲全局。

因爲上下文在調用時綁定,所以可能會出現預料以外的狀況。將->改成=>,能夠確保this的意義與函數定義所在位置的this同樣。編程

屬性參數能夠縮短代碼,如數組

setName = (name) -> @name = name 

能夠簡寫爲閉包

setName = (@name) -> 

使用表達式做默認參數,則表達式將在函數被調用的上下文中執行。app

函數調用能夠寫成do f。例如do (x) -> ...((x) -> ...)(x)的簡寫,這個例子是node.js循環中捕獲變量的經常使用寫法。函數

 

=>箭頭函數表達式:this

不綁定this

在箭頭函數出現以前,每一個新定義的函數都有它本身的 this值(在構造函數的狀況下是一個新對象,在嚴格模式的函數調用中爲 undefined,若是該函數被做爲「對象方法」調用則爲基礎對象等)。This被證實是使人厭煩的面向對象風格的編程。spa

function Person() {
  // Person() 構造函數定義 `this`做爲它本身的實例.
  this.age = 0;

  setInterval(function growUp() {
    // 在非嚴格模式, growUp()函數定義 `this`做爲全局對象, 
    // 與在 Person()構造函數中定義的 `this`並不相同.
    this.age++;
  }, 1000);
}

var p = new Person();

 

在ECMAScript 3/5中,經過將this值分配給封閉的變量,能夠解決this問題。code

function Person() {
  var that = this;
  that.age = 0;

  setInterval(function growUp() {
    //  回調引用的是`that`變量, 其值是預期的對象. 
    that.age++;
  }, 1000);
}

 

或者,能夠建立綁定函數,以便將預先分配的this值傳遞到綁定的目標函數(上述示例中的growUp()函數)。對象

箭頭函數不會建立本身的this,它只會從本身的做用域鏈的上一層繼承this。所以,在下面的代碼中,傳遞給setInterval的函數內的this與封閉函數中的this值相同:

function Person(){
  this.age = 0;

  setInterval(() => {
    this.age++; // |this| 正確地指向 p 實例
  }, 1000);
}

var p = new Person();

 

與嚴格模式的關係

鑑於 this 是詞法層面上的,嚴格模式中與 this 相關的規則都將被忽略。

function Person() {
  this.age = 0;
  var closure = "123"
  setInterval(function growUp() {
    this.age++;
    console.log(this.age);//NAN
  }, 1000);
}

var p = new Person();

function PersonX() {
  'use strict'
  this.age = 0;
  var closure = "123"
  setInterval(()=>{
    this.age++;
  console.log(this.age);//正常的計數
}, 1000); } var px = new PersonX();

 

嚴格模式的其餘規則依然不變.

相關文章
相關標籤/搜索