使用三元运算符时返回undefined的Object属性

时间:2017-04-02 00:23:47

标签: javascript jquery object sharepoint

我正在构建一个对象文字,并使用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),并且工作正常。

enter image description here

2 个答案:

答案 0 :(得分:1)

在评估三元表达式时,初始化函数内的cca的赋值尚未发生。因此,cca.englishTitlecca.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声明之后不会立即可用,因为它现在是异步的。

但是,由于这是在几微秒内解决的,因此您可以继续正常执行代码并且不用担心它。