js中三個默認方法call,applay,bind

這三個都是函數自帶的方法(Function.prototype),這三個方法都可以改變函數內部 this的指向,數組

callapp

//call方法接收三個參數,第一個是this指向,第二個,三個是傳遞給函數的實參,能夠是數字,字符串,數組等類型的數據類型均可以
function fn(n1,n2){
   console.log(this);  
   console.log(n1,n2)
}
fn.call();//=>this:window;
let obj = {fn:fn};
fn.call(obj);//=>this:obj;n1,n2:undefined
fn.call(1,2);//=>this: 1;n1=2,n2=undefined;
fn.call(obj,1,2);//=>this: obj;n1=1,n2=2;

//Call方法的幾個特殊屬性
//非嚴格模式下
fn.call(undefined);//this=>window
fn.call(null);//this=>window
//嚴格模式下
"use strict"
fn.call(undefined);//this=>undefined
fn.call(null);//this=>null

apply函數

//apply方法的使用和call方法基本相同,惟一的區別是,apply方法傳參要求是數組類型的,數組內能夠任意形式的數據

function fn (n1,n2){
    console.log(this);
    console.log(n1,n2)
    console.log(arguments)
}
let obj = {fn:fn};
fn.applay(abj,[1,2]);
fn.applay(abj,1,2);//報錯

fn.applay(abj,[11,'apply',{a:123}]);//注意第二個參數必須是數組,不然會報錯
 

bindthis

//bind和call方法調用形式相似,可是原理徹底不一樣
fn.call(obj,10,20);//=>fn先執行,將fn內的this指向obj,而且把參數10,20傳遞給fn

fn.bind(obj,10,20)//bind是先將fn中的this指向obj,而且將參數10,20預先傳遞給fn,可是此時的fn並無被執行,只有fn執行時this指向和傳遞參數纔有做用
fn.bind(obj,10,20);//=>不會有任何輸出
fn.bind(obj,10,20)();//=>調用後纔會有輸出

//=>需求:點擊box這個盒子的時候,須要執行fn,而且讓fn中的this指向obj
oBox.onclick=fn; //=>點擊的時候執行了fn,但此時fn中的this是oBox

oBox.onclick=fn.call(opp); //=>綁定事件的時候就已經把fn當即執行了(call自己就是當即執行函數),而後把fn執行的返回值綁定給事件

oBox.onclick=fn.bind(opp);
//=>fn.bind(opp):fn調取Function.prototype上的bind方法,執行這個/* 
 * function(){
 *     fn.call(opp);
 * }
 */
oBox.onclick=function(){
   //=>this:oBox
    fn.call(opp);
}
相關文章
相關標籤/搜索