原生JS實現call apply bind

2021-09-13 21:07:59 字數 1955 閱讀 1073

this的指向。作用都是相同的,只是傳參的方式不同。

bind將函式繫結到某個物件,

bind()

會建立乙個函式,函式體內的

this

物件的值會被繫結到傳入

bind()

中的第乙個引數的值

下面三種方法對取第二個之後的引數是等效的

整體思路:將函式或者方法新增在物件上,那麼該物件就可以呼叫該函式了,但是要呼叫結束後刪除掉該函式。

獲得物件,當沒有傳遞引數時候,為window(特殊情況處理)

給物件新增方法,方法賦值為該函式(this獲取)

獲得第二個之後的引數作為執行的引數

執行該物件的方法(傳參)獲得結果

刪除物件的方法

返回結果

function.prototype.mycall=function(context)
驗證:

var a=2;

var obj=

function say(b,c)

say(4,3);//2,7

say.mycall(obj,1,1)//1 2

思路:與call類似,對於傳入引數進行判斷,如果存在第二個引數(陣列),展開陣列傳入函式執行

獲得物件,當沒有傳遞引數時候,為window(特殊情況處理)

給物件新增方法,方法賦值為該函式(this獲取)

判斷是否存在第二個引數(陣列)存在,執行該物件的方法(傳參)獲得結果

;不存在,執行該物件的方法(不傳參)獲得結果

刪除物件的方法

返回結果

var context=context||window;

context.fn=this;

var res;

if(arguments[1])else

delete context.fn;

return res;}

驗證

var a=2;

var obj=

function say(b,c)

say(4,3);//2,7

function.prototype.mybind=function (context) 

var self=this;//儲存呼叫bind的函式

// var context=.shift.call(arguments);

// var context=array.prototype.shift.call(arguments);

//如果沒有傳入引數,通過arguments獲得繫結的this上下文

var args=.slice.call(arguments,1);//獲取繫結this時候傳入的引數,與呼叫時的引數區分開

// var args=array.prototype.slice.call(arguments,1);//與上面一行等效

var fbound=function ()

//返回的函式的原型鏈要和呼叫bind的函式原型鏈相同

fbound.prototype=object.create(self.prototype);

return fbound;

}

驗證

function bar()

console.log(this);

console.log(sum)

}var foob=bar.mybind(,3);

bar(1,2);//window 3

foob(4)// 7

原生JS 封裝call apply 函式

var value window var obj function show name,age 改變this指向的原理大概是這個樣子的 obj.show show obj.show delete obj.show 很簡單的過程,應該都能明白在函式的原型鏈上封裝兩個函式 封裝call函式 functi...

js 難點之call,apply實現

1 function bar bar.call foo 1 bar 函式執行了 1,bar function foo.bar 1 執行該函式 刪除該函式 foo.fn bar 第二步 foo.fn 第三步 delete foo.fn function.prototype.call2 function...

原生js實現Ajax

一般來說,大家可能都會習慣用jquery提供的ajax方法,但是用原生的js怎麼去實現ajax方法呢?jquery提供的ajax方法 ajax success function error function 原生js實現ajax方法 var ajax obj.send post function u...