特色:數組
做用:app
1-1 證實是原函數的拷貝 (須要知道:函數也是對象,而且是引用類型,比較的是內存地址)函數
function fn(){} var bindFn = fn.bind(); //ƒ fn(){ return this } 供之後調用 fn === bindFn //false
2-1 將函數中的this固定爲調用bind方法時的第一個參數this
function fn(){ return this } var bindFn = fn.bind({name:"綁定函數"}) //ƒ fn(){ return this }
3-1 之後不管由哪一個對象調用綁定函數,綁定函數中的this依然是{name:"綁定函數"}指針
function fn(){ console.log(this) } var bindFn = fn.bind({name:"綁定函數"}) bindFn() //等同於window對象調用 , this依然指向{name:"綁定函數"} var obj = {name:"obj"}; obj.fn = bindFn; obj.fn() //由普通對象調用 ,this依然指向{name:"綁定函數"} var arr = [bindFn]; arr[0]() //由數組調用 , this依然指向{name:"綁定函數"} setTimeout(bindFn , 200); //做爲回調函數 , this依然指向{name:"綁定函數"} clearTimeout(1);
4-1 若是綁定函數做爲構造函數,已經捆綁的this會被忽略掉,this依然指向實例對象code
function Person(name){ this.name = name; } var bindPerson = Person.bind({name:"綁定函數"}) new bindPerson("張三") // Person {name: "張三"}
5-1 預設參數對象
function fn(a,b,c,d){ console.log(a,b,c,d) // 1 ,2 ,3 ,4 } var bindFn = fn.bind({name:"綁定函數"} , 1 ,2); // 拷貝原函數時的第2個參數開始日後稱爲預設參數 bindFn(3,4); //調用綁定函數時的第一參數則排在預設參數的後面
6-1 當沒有參數、第一個參數爲undefined、第一個參數爲null時繼承
var obj = { fnOne:function(){ return this }.bind(), fnTwo:function(){ return this }.bind( undefined ), fnThree:function(){ return this }.bind( null ) } //注意:這三種狀況是使this指向window對象,而不是不去改變this指向,因此這裏的this仍是不會指向obj obj.fnOne() // window obj.fnTwo() //window obj.fnThree() //window
特色:內存
做用:回調函數
1-1 返回值取決於目標函數的返回值
function fn(){ return {name:"call"} } fn.call() // {name: "call"}
2-1 改變目標函數體內的this指向 , 至關於使用第一個參數對象調用
function fn(){ return this } fn.call( { name : "call" } ) // {name: "call"}
3-1 參數位置
function fn(a, b, c){ return arguments } fn.call( { name : "call" } , 1 , 2 , 3 ) //Arguments [1, 2, 3]
1-2 用於繼承
function parent(name, age) { this.name = name; this.age= age; } function child(name, age) { parent.call(this, name, age); this.class = '三年級二班'; } var xiaoming = new child("小明" , 18)
特色:
做用:
1-1 參數
function fn(a, b, c){ return a+b+c } fn.apply({name:"apply"} ,[1,2,3]) //6