JS總某物件內this是誰的判斷
阿新 • • 發佈:2018-12-11
一.問題描述
在工作中接個SDK介面的時候遇到個問題,就是在類中呼叫別的物件方法時,該方法引數為一個物件,該物件裡面的value值裡面的this,不知道是誰:可能是1.當前操作類物件,2.可能是當前方法的所屬物件
程式碼如下
declare let share_game: any; class LoginView { public constructor() { this.onClickRun(); } //執行上下文環境一步 public onClickRun() { //呼叫分享方法 //執行share_weibo時為上下文環境二步 share_game.share_weibo({//這個引數為一個物件 //疑惑---this success: this.shareSuccess.bind(this), error: this.shareErr.bind(this) }); } public shareSuccess() { alert('成功'); } public shareErr() { alert('失敗'); } }
二.問題解答
從程式碼中可以看出this在一個物件中,該物件作為引用物件的一個引數
原本以為該this為share_game這個物件的,因為share_weibo這個函式是share_game呼叫的,但是
this的所屬作用域類似引數的作用域內判斷:
1.當執行share_weibo這個函式時(在js的連結中執行的執行上下文環境二步),執行上下文環境為share_game物件內,引數優先判斷是share_game內建立的變數,但是傳進去的物件引數為使用時才建立的臨時變數(執行上下文環境一步),建立該變數的時候執行上下文還是在LoginView內,所以這個this為LoginView 物件(或者說呼叫onClickRun的物件);
2.為了更明顯的看清this是誰,可以把物件引數抽出來寫
//執行上下文環境一步 public onClickRun() { let obj = {//這個引數為一個物件 //疑惑---this success: this.shareSuccess.bind(this), error: this.shareErr.bind(this) } //執行share_weibo時為上下文環境二步 //把obj放到外面寫,很明顯success:中的this為onClickRun函式的呼叫者 share_game.share_weibo(obj); }