2017-04-02 102 views
0

我正在構建一個對象字面值並使用if-else簡寫來設置我的屬性值之一,但它一直返回undefined,我不明白爲什麼:使用三元運算符時返回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

回答

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",這是因爲分配已經完成(你是下一個語句)。

+0

所以基本上我在他們發起之前就打電話給他們? – Batman

+0

@Batman - 確實如此。 –

0

你也可以用promise來解決它。看看下面的代碼:

var test = { 
 
    a: 'aaa', 
 
    b: Promise.resolve(test).then(()=>test.b = test.a)  
 
} 
 

 
async function show() { 
 
\t await test.b; 
 
\t 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() { 
 
\t await cca.site_title; 
 
\t console.log(cca); 
 
} 
 
initialization(); 
 
show();

請明白,

async function show() { 
    await cca.site_title; 
    console.log(cca); 
} 
show();  

部分只是爲了讓您能夠看到完整的對象,因爲它現在是異步性質,因此在cca聲明之後它將不可用。

但是,因爲這是以微秒爲單位解決的,所以您可以繼續正常執行代碼並且不用擔心。