成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

前端基礎(chǔ)知識總結(jié)

MageekChiu / 441人閱讀

摘要:關(guān)于前端中是個老生常談的問題,總是說不清道不明,看這里。的大致用法,相信接觸過前端的同學(xué)都知道,無非以下種。先想一下,兩次執(zhí)行后結(jié)果是什么。輸出總結(jié)被誰調(diào)用指向誰,沒有被調(diào)用的情況下,瀏覽器默認(rèn)為。由于箭頭函數(shù)中的,總是指向父級作用域。

關(guān)于this

前端中this是個老生常談的問題,總是說不清道不明,看這里。
this只能用在函數(shù)里面,相信全世界的人都知道。
this就是函數(shù)在被執(zhí)行的時候,產(chǎn)生的執(zhí)行上下文(context)。
this的大致用法,相信接觸過前端的同學(xué)都知道,無非以下5種。

1、 function test(){
       console.log(this);
    }
    test(); //不是對象的屬性,直接執(zhí)行
    
2、 var object = {
       test: test() {
          console.log(this);
       }
    }
    object.test(); //作為對象的屬性被調(diào)用
    
3、 test.call(object); // apply用法差不多

4、 Function test() {
       this.name = test;
   }

5、箭頭函數(shù)中的this

其中第4種構(gòu)造函數(shù)沒什么可說的,構(gòu)造出了誰,誰就是this。
平常用的最多的也就是前3種,先說第3種情況。最后說第5種。

第3種情況被執(zhí)行的時候,
object就是作為函數(shù)參數(shù)被傳入到test()中,這個函數(shù)參數(shù)就是this。
也就是說在test()被執(zhí)行的時候,this就是指向object。

第1種,第2種情況就是第3種情況的語法糖。

test.call(undefined);
object.test.call(object); //被誰調(diào)用指向誰
如果你傳的 context 不是一個對象,那么在瀏覽器中默認(rèn)是 window 對象。

分析下面的例子:

var name = "hut";
var obj = {
  name : "lucy",
  foo : function() {
     console.log(this.name);
  }
}
obj.foo(); 

var otherObj = {
  name : "john",
  foo : obj.foo
}

obj.foo(); 
otherObj.foo();

那么obj.foo(); otherObj.foo(); 就是我們上面所說的第2種情況。

先想一下,兩次執(zhí)行后結(jié)果是什么。

obj.foo() 其實就是:obj.foo.bind(obj),
也就是說函數(shù)在被執(zhí)行的時候,是被obj調(diào)用的,那么函數(shù)內(nèi)的this就是obj

function() {
   console.log(this.name); // 輸出lucy
}

執(zhí)行上下文(context)中的this是指向obj

otherObj.foo() 其實就是obj.foo.bind(otherObj)
也就是說函數(shù)在被執(zhí)行的時候,是被otherObj調(diào)用的,那么函數(shù)內(nèi)的this就是otherObj

function() {
   console.log(this.name);  // 輸出john
}

再來看一個例子:

var name = "Bob";
var obj = {
  name = "lucy",
  foo : function() {
     console.log(this.name);
  }
}
obj.foo(); 

var otherObj = {
  name :"john",
  foo : function() {
     var testFunc = obj.foo();
     testFunc();
  }
}

otherObj.foo();

分析:
執(zhí)行otherObj.foo(); 后,接著執(zhí)行obj.foo();,也就是說執(zhí)行下面的函數(shù)。
那么這個函數(shù)是被誰調(diào)用的呢,誰也沒有調(diào)用這個函數(shù)obj.foo()前面誰也沒有。
也就是obj.foo.bind(undefined);

function() {
   console.log(this.name);  // 輸出Bob
}

最后看一個例子:

var name = "Bot";
var obj = {
  name : "lucy",
  showName: function() {
     console.log(this.name)
  },
  foo : function() {
     (function(callback) {
       callback();
     })(this.showName)
  }
}
obj.foo(); 

分析:
執(zhí)行obj.foo(); 后,this.showName中的this就是obj,
也就是將obj.showName;傳給cb,由于是立即執(zhí)行函數(shù),
則執(zhí)行callback();也就是執(zhí)行下面的函數(shù)
那么這個函數(shù)是被誰調(diào)用的呢,誰也沒有調(diào)用這個函數(shù)callback前面誰也沒有。
也就是obj.showName.bind(undefined);,輸出Bob。

function() {
   console.log(this.name);  // 輸出Bob
}

總結(jié):
this被誰調(diào)用指向誰,沒有被調(diào)用的情況下,瀏覽器默認(rèn)為window。

特殊情況:
setTimeout,setInterval,匿名函數(shù)執(zhí)行的時候,
函數(shù)體內(nèi)的this為全局對象window。

最后說第5種,箭頭函數(shù)中的this。

箭頭函數(shù)內(nèi)部并沒有實現(xiàn)綁定this的機(jī)制,其實箭頭函數(shù)并沒有自己的this,
箭頭函數(shù)內(nèi)部的this總是指向父級作用域。

什么意思呢,看個例子。

    var name = "Bob";
    var obj = {
        name : "a",
        showName: () => {
            console.log(this.name);
        }
    }
    obj.showName(); // Bob

分析:
obj.showName()是在全局作用域下被調(diào)用的,然后執(zhí)行下面的函數(shù)。

() => {
         console.log(this.name);
      }

由于箭頭函數(shù)中的this,總是指向父級作用域。
obj.showName()是在全局作用域下被調(diào)用的,不是obj,obj啥也不是。
所以輸出Bob。

call、apply和bind的區(qū)別
function add(a,b,c) {
  console.log(this);
  return a+b+c;
}

以上3個方法都是函數(shù)的方法,call和apply都可以改變函數(shù)this,傳遞的參數(shù)方式不同。
call一個一個傳遞,add.call(obj, 1,2,3);
apply以數(shù)組的方式傳遞,add.apply(obj, [1,2,3]);,更方便。

bind也可以改變函數(shù)內(nèi)部的this,它還可以傳遞固定參數(shù),
var fix = add.bind(null, 100);
函數(shù)bind后,與call,apply方法的另一個區(qū)別是,
bind便不立即執(zhí)行,而apply,call會立即執(zhí)行,
add.apply(obj, [1,2,3]); 會立即執(zhí)行得到結(jié)果6,
但是函數(shù)bind后,var fix = add.bind(null, 100);便不會立即執(zhí)行,
fix(2,3),調(diào)用后才會執(zhí)行,得到結(jié)果105,
var fix = add.bind(null, 100);綁定了第一個參數(shù)為100,
相當(dāng)與固定了第一個參數(shù)的值為100,fix函數(shù)被調(diào)用后,則只需要傳入之后的參數(shù)即可。

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

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/95822.html

相關(guān)文章

  • 前端開發(fā)-從入門到Offer - 收藏集 - 掘金

    摘要:一些知識點有哪些方法方法前端從入門菜鳥到實踐老司機(jī)所需要的資料與指南合集前端掘金前端從入門菜鳥到實踐老司機(jī)所需要的資料與指南合集歸屬于筆者的前端入門與最佳實踐。 工欲善其事必先利其器-前端實習(xí)簡歷篇 - 掘金 有幸認(rèn)識很多在大廠工作的學(xué)長,在春招正式開始前為我提供很多內(nèi)部推薦的機(jī)會,非常感謝他們對我的幫助?,F(xiàn)在就要去北京了,對第一份正式的實習(xí)工作也充滿期待,也希望把自己遇到的一些問題和...

    sf_wangchong 評論0 收藏0
  • 騰訊前端求職直播課——面試篇

    摘要:主講人石小勇騰訊高級前端工程師,核心成員之一,現(xiàn)主要負(fù)責(zé)騰訊興趣部落的研發(fā)設(shè)計工作閑聊前端從移動時代開始,前后端分離之后,前端這個崗位才開始慢慢火起來一線城市前端需求量大,但合格前端很少大話面試面試如相親,為什么這么說五大要素顏王面試的第一 主講人:AlloyTeam@石小勇(騰訊高級前端工程師,AlloyTeam核心成員之一,現(xiàn)主要負(fù)責(zé)騰訊QQ興趣部落的研發(fā)設(shè)計工作) 1.閑聊前端 ...

    YFan 評論0 收藏0
  • 騰訊前端求職直播課——面試篇

    摘要:主講人石小勇騰訊高級前端工程師,核心成員之一,現(xiàn)主要負(fù)責(zé)騰訊興趣部落的研發(fā)設(shè)計工作閑聊前端從移動時代開始,前后端分離之后,前端這個崗位才開始慢慢火起來一線城市前端需求量大,但合格前端很少大話面試面試如相親,為什么這么說五大要素顏王面試的第一 主講人:AlloyTeam@石小勇(騰訊高級前端工程師,AlloyTeam核心成員之一,現(xiàn)主要負(fù)責(zé)騰訊QQ興趣部落的研發(fā)設(shè)計工作) 1.閑聊前端 ...

    gxyz 評論0 收藏0
  • 騰訊前端求職直播課——面試篇

    摘要:主講人石小勇騰訊高級前端工程師,核心成員之一,現(xiàn)主要負(fù)責(zé)騰訊興趣部落的研發(fā)設(shè)計工作閑聊前端從移動時代開始,前后端分離之后,前端這個崗位才開始慢慢火起來一線城市前端需求量大,但合格前端很少大話面試面試如相親,為什么這么說五大要素顏王面試的第一 主講人:AlloyTeam@石小勇(騰訊高級前端工程師,AlloyTeam核心成員之一,現(xiàn)主要負(fù)責(zé)騰訊QQ興趣部落的研發(fā)設(shè)計工作) 1.閑聊前端 ...

    miya 評論0 收藏0
  • 前端最強(qiáng)面經(jīng)匯總

    摘要:獲取的對象范圍方法獲取的是最終應(yīng)用在元素上的所有屬性對象即使沒有代碼,也會把默認(rèn)的祖宗八代都顯示出來而只能獲取元素屬性中的樣式。因此對于一個光禿禿的元素,方法返回對象中屬性值如果有就是據(jù)我測試不同環(huán)境結(jié)果可能有差異而就是。 花了很長時間整理的前端面試資源,喜歡請大家不要吝嗇star~ 別只收藏,點個贊,點個star再走哈~ 持續(xù)更新中……,可以關(guān)注下github 項目地址 https:...

    wangjuntytl 評論0 收藏0
  • 個人分享--web前端學(xué)習(xí)資源分享

    摘要:前言月份開始出沒社區(qū),現(xiàn)在差不多月了,按照工作的說法,就是差不多過了三個月的試用期,準(zhǔn)備轉(zhuǎn)正了一般來說,差不多到了轉(zhuǎn)正的時候,會進(jìn)行總結(jié)或者分享會議那么今天我就把看過的一些學(xué)習(xí)資源主要是博客,博文推薦分享給大家。 1.前言 6月份開始出沒社區(qū),現(xiàn)在差不多9月了,按照工作的說法,就是差不多過了三個月的試用期,準(zhǔn)備轉(zhuǎn)正了!一般來說,差不多到了轉(zhuǎn)正的時候,會進(jìn)行總結(jié)或者分享會議!那么今天我就...

    sherlock221 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<