bind和forEach同時綁定this的時候,如何確定this指向?

"use strict";
const a=[1,2,30];
const b=[4,5,60];
const c=[7,8,90];
a.forEach((function (){
  console.log(this);
}).bind(globalThis),b);

這段代碼有bind的this綁定,也有foreach第二個參數的this綁定。結果是輸出全局對象,所以是bind的綁定生效。應該怎麼理解這個結果呢?如果說bind綁定發生在詞法階段,那麼可以確定它是在函數聲明的時候就確定了,並且由於是硬綁定,後面的重新綁定也無法再影響到它。但是問題是,foreach參數的this綁定好像也是在詞法階段就確定的。這樣的話,到底是以哪個綁定爲準?不給出輸出的話怎麼判斷this的指向?

閱讀 585

 

給你捋一下執行順序

//這是forEach中的匿名函數
funcA = function (){
  console.log(this);
}
//這是經過bind後傳入forEach中的回調
funcB = funcA.bind(gthis) = function (){
  funcA().call(gthis)
}
//然後運行a.forEach,裏面的回調會被綁定this指向b
funcB().call(b)

可以看到運行funcB並把funcB裏的this指向b,在運行funcA並把funcA裏的this指向gthis

 贊 1

 已採納

評論  讚賞  2019-05-20

  • Chor: 

    在朋友的提醒下結合了forEach的polyfill代碼和es5之前bind的實現方式看了一下,確實過程是像你上面說得這樣。不過在第三步的時候,可不可以理解爲funcB()的bind是硬綁定,並且在這個時候已經確定了this是window,後面的call(b)相當於是不生效的。又或者說是像你上面的第三步,實際上call(b)曾經生效過,只是後面又指向了window,所以看起來好像是沒有生效。

      回覆  2019-05-20

  • hfhan: 

    funcB().call(b)運行過後,funcB裏的this指向了b;funcA().call(gthis)運行過後,funcA裏的this指向了gthis,這是兩個this。js函數在未執行時就是一個代碼塊,可以不用看,當執行的時候纔會確定執行上下文,然後從上到下一句一句的執行。

      回覆  2019-05-20

  • hfhan
    var funcA = function(){
        console.log('funcA',this)
    }
    var funcB = function(){
        console.log('funcB',this)
        funcA.call({a:'funcB'})
    }

    你看下這個例子的執行結果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章