我正在构建一个对象文字,并使用if-else简写来设置我的某个属性的值,但它会一直返回undefined
而我不明白为什么:
var cca = cca || {};
var initialization = function () {
cca = {
languageCode: _spPageContextInfo.currentLanguage,
language: (_spPageContextInfo.currentLanguage == 1033) ? "english" : "french",
englishTitle: "ENGLISH SITE",
frenchTitle: "FRENCH SITE",
site_title: (_spPageContextInfo.currentLanguage == 1033) ? cca.englishTitle : cca.frenchTitle,
page: _spPageContextInfo,
path: _spPageContextInfo.webAbsoluteUrl,
isGrantSite: function () {
return _.includes(cca.path, "grants");
}
};
};
当我使用断点评估时,评估会返回正确的值,但不会保存到属性中。但是,我以类似的方式设置另一个属性(cca.language),并且工作正常。
答案 0 :(得分:1)
在评估三元表达式时,初始化函数内的cca
的赋值尚未发生。因此,cca.englishTitle
和cca.frenchTitle
尚不存在。一种解决方案是延迟特定的属性分配,直到之后:
var initialization = function () {
cca = {
languageCode: _spPageContextInfo.currentLanguage,
language: (_spPageContextInfo.currentLanguage == 1033) ? "english" : "french",
englishTitle: "ENGLISH SITE",
frenchTitle: "FRENCH SITE",
page: _spPageContextInfo,
path: _spPageContextInfo.webAbsoluteUrl,
isGrantSite: function () {
return _.includes(cca.path, "grants");
}
};
cca.site_title: (_spPageContextInfo.currentLanguage == 1033) ? cca.englishTitle : cca.frenchTitle;
site_setup();
};
至于为什么调试器正在将表达式计算为"ENGLISH SITE"
,这是因为赋值已经完成(您将进入下一个语句)。
答案 1 :(得分:0)
你也可以用承诺来解决它。看看这段代码:
var test = {
a: 'aaa',
b: Promise.resolve(test).then(()=>test.b = test.a)
}
async function show() {
await test.b;
console.log(test);
}
show();
所以你会这样做:
var cca = cca || {};
_spPageContextInfo = { currentLanguage: 1033};
var initialization = function () {
cca = {
languageCode: _spPageContextInfo.currentLanguage,
language: (_spPageContextInfo.currentLanguage == 1033) ? "english" : "french",
englishTitle: "ENGLISH SITE",
frenchTitle: "FRENCH SITE",
site_title: Promise.resolve(cca).then(()=>
cca.site_title = (_spPageContextInfo.currentLanguage == 1033) ? cca.englishTitle : cca.frenchTitle),
page: _spPageContextInfo,
path: _spPageContextInfo.webAbsoluteUrl,
isGrantSite: function () {
return _.includes(cca.path, "grants");
}
};
};
async function show() {
await cca.site_title;
console.log(cca);
}
initialization();
show();
请理解
async function show() {
await cca.site_title;
console.log(cca);
}
show();
部分只是为了能够看到完整的对象,因为它在cca声明之后不会立即可用,因为它现在是异步的。
但是,由于这是在几微秒内解决的,因此您可以继续正常执行代码并且不用担心它。