1. 程式人生 > >JS總某物件內this是誰的判斷

JS總某物件內this是誰的判斷

一.問題描述

在工作中接個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);
    }