do
能夠造成閉包,使方法做用域不受外部變化的影響。arguments
數組訪問傳遞給函數的全部對象(低可讀性)@name
爲this.name
的簡寫,this
表示上下文環境。相應的,有new
關鍵字,apply
和call
方法。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();
嚴格模式的其餘規則依然不變.