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...