我想创建一个对象来存储我将在我的网络应用中使用的变量。
我无法使用clientId
从clientSecret
访问uriGetToken
和this
。
此外,我可以使用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());
});
答案 0 :(得分: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)
}
答案 1 :(得分:1)
这是一个常见的Javascript问题,因为this
关键字的行为与其他OOP语言(如Java或C ++)不同。
问题是:
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;
您可以在此处详细了解Javascript this
关键字: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 );