2011-09-19 82 views
2

screenshot of google chrome developer tools showing that both objects have value這是如何評估爲假?

當我逐句通過這段代碼時,圖中的數值會導致cssLoaded = 0;從我可以看到,長度大於0,並且cssStylesheet.sheet具有屬性,所以應該爲true,因此應將cssLoaded設置爲1,但不會發生。我必須在這裏失去一些東西..?

function _cssIsLoaded(cssStylesheet, stylePath) { 
var cssLoaded = 0; 
if (tryCount == 3){ 
    console.log('oops'); 
} 
if (cssStylesheet.href == stylePath){ 
    try { 
     if (cssStylesheet.sheet && cssStylesheet.sheet.cssRules.length > 0){ 
      cssLoaded = 1;} 
     else if (cssStylesheet.styleSheet && cssStylesheet.styleSheet.cssText.length > 0){ 
      cssLoaded = 1;} 
     else if (cssStylesheet.innerHTML && cssStylesheet.innerHTML.length > 0){ 
      cssLoaded = 1;} 
     } 
     catch(ex){ } 
} 
    if(cssLoaded) { 
     //alert('cssloadedcomplete'); 
     resetPops(); 
     $('#video-overlay').show(); 
     positionElements(); 
     saveBizzmail(); 
     console.log('try:' + tryCount) 
    } else { 
     tryCount+=1; 
     console.log('try:' + tryCount); 
     setTimeout(function() { this._cssIsLoaded(cssStylesheet); }, 2000); 
    } 
} 
+4

這樣的條件:'if(cssStylesheet.href == stylePath){'pass? – jasonbar

+0

'cssStylesheet.sheet'評估的是什麼? –

+0

@jasonbar哇..喲。就像一匹帶着眼罩的馬! :p做到了! – Damon

回答

2

有三種可能的方式獲得你的代碼cssLoaded == 0;

  1. if (cssStylesheet.href == stylePath)評估爲false
  2. 全部三個if/else陳述評估爲false
  3. 其中一個if/else語句拋出異常,因此其他if/else語句不會執行。

在對您的問題進行故障排除時,您應該驗證前兩個不是問題,因爲這些可能只是比較中的邏輯錯誤,或者進入函數的數據並非您預期的那樣。

對於第三個問題,您可以實施防禦性編碼以確保通過將代碼更改爲此來檢查所有三個if/else語句(您甚至不需要try/catch,因爲它允許您的代碼繞過一些測試):

function _cssIsLoaded(cssStylesheet, stylePath) { 
    var cssLoaded = 0; 
    if (tryCount == 3){ 
     console.log('oops'); 
    } 
    if (cssStylesheet && cssStylesheet.href == stylePath) { 
     if (cssStylesheet.sheet && cssStylesheet.sheet.cssRules && cssStylesheet.sheet.cssRules.length > 0) { 
      cssLoaded = 1; 
     } 
     else if (cssStylesheet.styleSheet && cssStylesheet.styleSheet.cssText && cssStylesheet.styleSheet.cssText.length > 0) { 
      cssLoaded = 1; 
     } 
     else if (cssStylesheet.innerHTML && cssStylesheet.innerHTML.length > 0) { 
      cssLoaded = 1; 
     } 
    } 
    if(cssLoaded) { 
     //alert('cssloadedcomplete'); 
     resetPops(); 
     $('#video-overlay').show(); 
     positionElements(); 
     saveBizzmail(); 
     console.log('try:' + tryCount) 
    } else { 
     tryCount+=1; 
     console.log('try:' + tryCount); 
     setTimeout(function() { this._cssIsLoaded(cssStylesheet); }, 2000); 
    } 
} 
1

你必須檢查該元素的存在,否則可能會出現錯誤(cssStylesheet.sheetundefined)。一個表達式會假時:

  • 變量不存在(undefinednullvoid 0
  • 的Equals 0(零)
  • 的Equals false
  • 的Equals空字符串(""''
  • A非數值(0/0,NaN

請注意,空對象{}的計算結果爲true,因爲它是一個對象。

又如:

if(window.addEventListener) window.addEventListener("load", function(){}, true); 
else if(window.attachEvent) window.attachEvent("onload", function(){}); 
else window.onload = function(); 

如果if條件不存在,則代碼將拋出在舊版本的IE,其不具有這種稱爲window.addEventListener的方法的錯誤。

+0

有道理..但我的主要問題是,在上述情況下,爲什麼兩者或兩者都是'虛假'。那另外一個問題並沒有真正相關,只是意識流。我把它編輯出來了。 – Damon

+0

If,* One *:「是否存在cssStylesheet.sheet?」 If,* Two *:「cssStylesheet.sheet.cssRules'的長度屬性是否大於0」?如果* One *和* Two *爲真,則評估表達式。第一個表達式用於防止JavaScript錯誤,第二個表達式是特定的功能邏輯。 –

+1

+1添加到列表中:'NaN' :) – pimvdb

1

以前的檢查確保您避免類似情況的NPE(通過檢查cssStylesheet.sheet不爲空)。