成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

call、apply、bind 原理、區(qū)別及原生js模擬。

vpants / 3206人閱讀

摘要:的原型上存放著實(shí)例的一些共有方法。每個(gè)函數(shù)都可以調(diào)用方法,來改變當(dāng)前這個(gè)函數(shù)執(zhí)行的關(guān)鍵字,并且支持傳入?yún)?shù)我們用原生模擬方法,來更加深刻了解它。和方法類似,作用都是改變當(dāng)前函數(shù)執(zhí)行的指向,并且將函數(shù)執(zhí)行。

Function的prototype原型上存放著 Function實(shí)例 的一些共有方法。
A.Function的原型不像其他類(Array、Object...)的原型一樣是個(gè)對象,F(xiàn)uction的原型是一個(gè)空函數(shù),是可以執(zhí)行的,只不過返回undefined,F(xiàn)unction.prototype();但是這并不影響它作為一個(gè)對象擁有自己的屬性方法
B.Function這個(gè)類,同時(shí)也是Function的一個(gè)實(shí)例,所以它也具備__proto__屬性,這個(gè)屬性指向它自己的原型

1.call方法。每個(gè)函數(shù)都可以調(diào)用call方法,來改變當(dāng)前這個(gè)函數(shù)執(zhí)行的this關(guān)鍵字,并且支持傳入?yún)?shù);我們用原生js模擬call方法,來更加深刻了解它。
a.第一個(gè)參數(shù)為調(diào)用call方法的函數(shù)中的this指向
b.第二個(gè)及以后的參數(shù)為給調(diào)用call方法的函數(shù)傳入的參數(shù)
c.執(zhí)行這個(gè)函數(shù),call方法返回的結(jié)果就是 調(diào)用他的函數(shù)返回的結(jié)果
d.將this指向銷毀。

Function.prototype.mycall = function(context){
    context = context || window;
    context.fn = this;
    var arr = [];
    for(var i = 1;i

2.apply和call方法類似,作用都是改變當(dāng)前函數(shù)執(zhí)行的this指向,并且將函數(shù)執(zhí)行。
唯一不同就是 call方法給當(dāng)前函數(shù)傳參是一個(gè)一個(gè)傳。而apply是以數(shù)組方式傳入?yún)?shù)

Function.prototype.myApply =function(context,arr){
context = Object(context) || window;
context.fn = this;
var result;
if(!arr){
    result= context.fn();
}else{
    var args = [];
    for(var i=0;i

3.bind方法,是改變當(dāng)前調(diào)用bind方法的函數(shù)this指向,但是不會立即執(zhí)行當(dāng)前函數(shù),而是返回一個(gè)新的函數(shù)。并且支持給新的函數(shù)傳入?yún)?shù)執(zhí)行,從而出發(fā)之前調(diào)用bind方法的函數(shù)執(zhí)行,并且參數(shù)透傳進(jìn)去。bind方法是高階函數(shù)的一種。

Function.prototype.myBind = function(){
var context = arguments[0];
var self = this;
return function (){
    self.myApply(context,arguments)
}
};
var j = {name:1};
var k = [123]
function drink (k){
    console.log(this.name,k);
}
var fn = drink.myBind(j);
fn(k);

實(shí)現(xiàn)原生 call、apply、bind方法的重點(diǎn):
1.改變this指向:函數(shù)執(zhí)行,點(diǎn).前面是誰,this就是誰的原理改變this指向
2.參數(shù)透傳:通過eval將字符串轉(zhuǎn)變成js語法 去執(zhí)行。
3.bind方法返回一個(gè)函數(shù),返回的函數(shù)執(zhí)行,會進(jìn)行作用域查找context對象;并且通過原型鏈查找調(diào)用apply方法

call、apply、bind相同和區(qū)別
相同:都能改變函數(shù)執(zhí)行的this指向
不同:callapply 是立即執(zhí)行 bind是不執(zhí)行

call傳參是一個(gè)一個(gè)傳入,apply是數(shù)組形式傳入

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/93582.html

相關(guān)文章

  • 可能遇到假的面試題:不用callapply方法模擬實(shí)現(xiàn)ES5的bind方法

    摘要:來自朋友去某信用卡管家的做的一道面試題,用原生模擬的方法,不準(zhǔn)用和方法。他們的用途相同,都是在特定的作用域中調(diào)用函數(shù)。不同之處在于,方法傳遞給調(diào)用函數(shù)的參數(shù)是逐個(gè)列出的,而則是要寫在數(shù)組中。 本文首發(fā)我的個(gè)人博客:前端小密圈,評論交流送1024邀請碼,嘿嘿嘿?。 來自朋友去某信用卡管家的做的一道面試題,用原生JavaScript模擬ES5的bind方法,不準(zhǔn)用call和bind方法。 ...

    李世贊 評論0 收藏0
  • 可能遇到假的面試題:不用callapply方法模擬實(shí)現(xiàn)ES5的bind方法

    摘要:來自朋友去某信用卡管家的做的一道面試題,用原生模擬的方法,不準(zhǔn)用和方法。他們的用途相同,都是在特定的作用域中調(diào)用函數(shù)。不同之處在于,方法傳遞給調(diào)用函數(shù)的參數(shù)是逐個(gè)列出的,而則是要寫在數(shù)組中。 本文首發(fā)我的個(gè)人博客:前端小密圈,評論交流送1024邀請碼,嘿嘿嘿?。 來自朋友去某信用卡管家的做的一道面試題,用原生JavaScript模擬ES5的bind方法,不準(zhǔn)用call和bind方法。 ...

    ConardLi 評論0 收藏0
  • 【進(jìn)階3-3期】深度解析 callapply 原理、使用場景實(shí)現(xiàn)

    摘要:之前文章詳細(xì)介紹了的使用,不了解的查看進(jìn)階期。不同的引擎有不同的限制,核心限制在,有些引擎會拋出異常,有些不拋出異常但丟失多余參數(shù)。存儲的對象能動(dòng)態(tài)增多和減少,并且可以存儲任何值。這邊采用方法來實(shí)現(xiàn),拼成一個(gè)函數(shù)。 之前文章詳細(xì)介紹了 this 的使用,不了解的查看【進(jìn)階3-1期】。 call() 和 apply() call() 方法調(diào)用一個(gè)函數(shù), 其具有一個(gè)指定的 this 值和分...

    godlong_X 評論0 收藏0
  • 面試官:你能手寫實(shí)現(xiàn)call,apply,bind方法嗎?

    摘要:前言實(shí)踐系列主要是讓我們通過實(shí)踐去加深對一些原理的理解。求求三兄弟的作用都是為了改變函數(shù)運(yùn)行時(shí)上下文指向而存在的。不會立即調(diào)用其他兩個(gè)會立即調(diào)用。如果有幫助到你請給我一個(gè)就算是對我的感謝啦 前言 [實(shí)踐系列] 主要是讓我們通過實(shí)踐去加深對一些原理的理解。 實(shí)踐系列-前端路由 實(shí)踐系列-Babel原理 實(shí)踐系列-Promises/A+規(guī)范 實(shí)踐系列-瀏覽器緩存機(jī)制 有興...

    Warren 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<