0

Web アプリで使用する変数を格納するオブジェクトを作成したいと思います。

を使用してclientIdと にアクセスできません。clientSecreturiGetTokenthis

また、関数 in を使用できmApiGetTokenますtoken

私が間違っていることと、それを修正する方法を教えていただけますか?

   $(document).ready(function () {

        // General Settings
        var mApiSettings = {
            clientId: 'aaa',
            clientSecret: 'bbb',
            token: mApiGetToken(),
            uriGetToken: 'https://ccc/oauth/token?grant_type=client_credentials&client_id=' + this.clientId + '&client_secret=' + this.clientSecret
        }

        console.log(mApiSettings.uriGetToken);
        // Get Autheticated, it requires getting a Token from HollyByte
        function mApiGetToken() {

            $.getJSON(mApiSettings.uriGetToken, processData);
            function processData(data) {
                mApiSettings.token = data.access_token;
            }
            //return token;
        }

        // For Testing
        console.log(mApiGetToken());

    });
4

2 に答える 2

2

の値は、その関数が呼び出されたときに表示される関数thisに対して決定されます。

使用しているオブジェクトリテラルthisとの値の間に関係はありませんthis

また、オブジェクトを作成しているオブジェクトリテラルステートメントの途中でオブジェクトのプロパティにアクセスする方法もありません。

変数を使用する必要があります。

例には特殊文字は含まれていませんが、URIに挿入するデータをエスケープすることを習慣にする必要があります。

    var clientId, clientSecret, mApiSettings;
    clientId = 'aaa';
    clientSecret = 'bbb';
    mApiSettings = {
        clientId: clientId,
        clientSecret: clientSecret,
        token: mApiGetToken(),
        uriGetToken: 'https://ccc/oauth/token?grant_type=client_credentials&client_id=' + encodeURIComponent(clientId) + '&client_secret=' + encodeURIComponent(clientSecret)
    }
于 2012-11-08T13:40:47.650 に答える
1

thisキーワードはJavaやC++などの他のOOP言語のように動作しないため、これは一般的なJavascriptの質問です。

問題は:

var o = {
    a : 2,
    b : this.a *2
}
console.log( b ); //prints NaN because the value for this.a is undefined at the time b is being initialized

thisオブジェクトリテラルの初期化ではアクセスできないためです。回避策は、次の代わりにオブジェクトの名前を使用することですthis

var o = {
    a : 2,
    b : o.a *2
}
console.log( b ); //prints 4

または、オブジェクトを一度に1つずつ定義することもできます。

var o = {
    a : 2
}
o.b = o.a *2;
console.log( b ); //prints 4

とにかく、次のように変更すると、コードは機能するはずですmApiSettings

var mApiSettings = {
            clientId: 'aaa',
            clientSecret: 'bbb',
            token: mApiGetToken()
}

mApiSettings.uriGetToken = 'https://ccc/oauth/token?grant_type=client_credentials&client_id=' + mApiSettings.clientId + '&client_secret=' + mApiSettings.clientSecret;

Javascriptthisキーワードの詳細については、http://unschooled.org/2012/03/understanding-javascript-this/を参照してください。

編集:

他の回答が示唆しているように、URLに埋め込む前にclientSecretとclientIdをエンコードすることをお勧めします。その場合は、次のコードを使用できます。

var mApiSettings = {
            clientId: 'aaa',
            clientSecret: 'bbb',
            token: mApiGetToken()
}

mApiSettings.uriGetToken = 'https://ccc/oauth/token?grant_type=client_credentials&client_id=' + encodeURIComponent( mApiSettings.clientId ) + '&client_secret=' + encodeURIComponent( mApiSettings.clientSecret );
于 2012-11-08T13:45:08.827 に答える