我试图在JavaScript对象中做一些逻辑来确定值应该是什么,并且遇到了一些困难。
我有一个'config'对象:
var gRestfulServicesHost = new function() {
return {
hostUrlPrefix: 'http://',
hostUrl: 'somehost.example.com',
hostVitalSourceGPOUrl: 'local.somehost.com/restful',
relativePathUI: '/application',
relativePathRestfulSvc: function() {
if(oGetVars.env) {
switch (oGetVars.env) {
case 'dev':
console.warn('Using dev restful service');
break;
case 'qa':
console.warn('Using qa restful service');
break;
case 'release':
console.warn('Using release restful service');
break;
case 'staging':
console.warn('Using staging restful service');
break;
case 'demo':
console.warn('Using demo restufl service');
break;
default:
console.warn('Using local restful service');
break;
}
}
return '/some-provider/api';
}
}
};
但是当我去检索值时,这样的东西就可以了:
gRestfulServicesHost.hostUrlPrefix // inspector shows 'http://'
但是当我想使用relativePathRestfulSvc
时,就像这样:
gRestfulServicesHost.relativePathRestfulSvc // inspector shows: function () { ... }
我想要函数的返回值,但它就像函数甚至没有被评估。我甚至用pare gRestfulServicesHost.relativePathRestfulSvc()
尝试了它,但它仍然不起作用。
由于
答案 0 :(得分:2)
那是因为你实际上并没有调用该函数,而是将一个函数赋给relativePathRestfulSvc
属性。要实际运行代码,您必须执行以下操作:
relativePathRestfulSvc: (function() {
if(oGetVars.env) {
switch (oGetVars.env) {
case 'dev':
console.warn('Using dev restful service');
break;
case 'qa':
console.warn('Using qa restful service');
break;
case 'release':
console.warn('Using release restful service');
break;
case 'staging':
console.warn('Using staging restful service');
break;
case 'demo':
console.warn('Using demo restufl service');
break;
default:
console.warn('Using local restful service');
break;
}
}
return '/some-provider/api';
})()
请注意,整个函数已包含在括号()
中,然后立即调用(以下()
),它将函数的返回值赋给relativePathRestfulSvc
属性。
此模式称为“立即调用函数表达式”(IIFE,发音为“iffy”),通常采用(function() { ... })()
的形式,声明函数并立即调用/调用。
您可以在此处阅读相关内容:http://en.wikipedia.org/wiki/Immediately-invoked_function_expression
答案 1 :(得分:1)
你实际上并没有在任何地方调用这个功能。你想要的东西是:
relativePathRestfulSvc: (function() {
if(oGetVars.env) {
switch (oGetVars.env) {
case 'dev':
console.warn('Using dev restful service');
break;
case 'qa':
console.warn('Using qa restful service');
break;
case 'release':
console.warn('Using release restful service');
break;
case 'staging':
console.warn('Using staging restful service');
break;
case 'demo':
console.warn('Using demo restufl service');
break;
default:
console.warn('Using local restful service');
break;
}
}
return '/some-provider/api';
})() // <--- Use () to call the function