0

我想创建一个对象来存储我将在我的网络应用程序中使用的变量。

我无法使用. clientId_clientSecreturiGetTokenthis

我也可以使用 inmApiGetToken中的功能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

这是一个常见的 Javascript 问题,因为this关键字的行为与 Java 或 C++ 等其他 OOP 语言不同。

问题是:

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

或者您可以一次定义一个对象:

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/

编辑:

正如另一个答案所暗示的那样,您可能希望在将 clientSecret 和 clientId 嵌入到 URL 之前对其进行编码。如果是这种情况,您可以使用以下代码:

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 回答