2017-04-02 104 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声明之后它将不可用。

但是,因为这是以微秒为单位解决的,所以您可以继续正常执行代码并且不用担心。