函式(三)
看 《 深入理解es6》 一書,有些知識點沒有記錄下來。 但大部分的知識點記錄下來了。
// 函式的一個特性
function Person(name) {
this.name = name;
}
var person = new Person("jack");
var notAPerson = Person("jack");
console.log(person); // "[Object object]"
console.log(notAPerson); // "undefined"
//js函式中有兩個不同的內部方法, [[Call]] 和 [[Construct]] 當通過new 關鍵字呼叫函式的時,執行的是[[Construct]]函式,它負責他負責建立一個通常被稱作例項的新物件,然後在執行函式體,將this繫結到例項物件中。如果不通過則使用[[Call]]函式,從而直接執行程式碼中的函式體。 具有[[Construct]]方法的函式被統稱為建構函式
// 注: 不是所有的函式都有[[Construct]],箭頭函式就沒有,故箭頭函式不能被new 來呼叫
// 預設引數對arguments的影響
//在es5中 非嚴格模式下 引數的改變會直接改變arguments的值
// 嚴格模式下 引數的改變不會影響arguments的值
function mixArgs(first, second) {
console.log(first === arguments[0]); // true
console.log(second === arguments[1]); // true
first = 'c';
second = 'd';
console.log(first === arguments[0]); // true 嚴格模式 false es6中 false
console.log(second === arguments[1]); // true 嚴格模式 false es6中 false
}
mixArgs('a', 'b');
// 這個是判斷 是否為new運算子出來的例項 物件
// 在函式外使用new.target 是一個語法錯誤
function Person(name) {
// new.target
if(typeof new.target === Person){
this.name = name;
}
}
// 箭頭函式
// 1. 沒有this、super、arguments和new.target繫結 (這些值由外圍的非箭頭函式所決定)
// 2. 不能通過new關鍵字呼叫
// 3. 沒有原型 (因為不能通過new關鍵字來呼叫箭頭函式)
// 4. 不可以改變this的繫結
// 5. 不支援 arguments 物件
// 6. 不支援重複的命名函式
// 注: 箭頭函式的name屬性和其他函式的規則相同
// 箭頭函式沒有arguments屬性
// let person = () => arguments[0]
// console.log(person(5))
這章節有預設引數的臨時死區、無名引數、元屬性(new.target)等