2017-04-09 66 views
-4

我是JavaScript新手,我只是想了解爲什麼'z'回到未定義狀態。爲什麼這是'undefined'

var z = functionWithParameters(4, 3); 
 
function functionWithParameters(x, y) { 
 
    if (typeof z !== 'undefined') { 
 
     document.getElementById("functionWithParameters").innerHTML = z; 
 
     console.log('inside function: ' + z); 
 
     console.log('inside function: z is a ' + typeof z); 
 
    } 
 
    console.log('before return: z = ' + z); 
 
    return x * y;  
 
} 
 
console.log('outside function: z = ' + z);
<p id = "functionWithParameters"></p> 
 
    <script> 
 
     functionWithParameters(4, 3); 
 
    </script>

如果我的代碼運行,沒有任何評論,它的結果:

before return: z = undefined 
outside function: z = 12 
inside function: 12 
inside function: z is a number 
before return: z = 12 

如果我刪除的:if(typeof運算ž== '未定義'! ),代碼結果如下:

inside function: undefined 
inside function: z is a undefined 
before return: z = undefined 
TypeError: document.getElementById(...) is null[Learn More] (from Firefox), 

和行:console.log('outsi de函數:z ='+ z);不執行。我雖然可能這是因爲該函數有一個返回語句,但註釋返回沒有改變結果。

任何幫助理解這將是非常棒的。 感謝您的任何反饋意見。

+0

我的猜測是var提升。因此,'z'沒有給出值並且是未定義的。 – Li357

+0

邏輯沒有意義。在函數中如何定義一個依賴函數返回的變量? – charlietfl

+0

@charlietfl我不知道這個例子,但它在遞歸關係算法中很有意義。 – Linek

回答

1

請閱讀Stack Overflow回答關於DOM加載/執行順序的問題。

您寫道:

如果我刪除的:if(typeof運算ž== '未定義'!),代碼結果與[..] 和行:執行console.log('之外的功能: z ='+ z);不執行。我雖然可能這是因爲該函數有一個返回語句,但註釋返回沒有改變結果。

那是因爲你之前加載p標籤導致document.getElementById("functionWithParameters")拋出一個錯誤執行functionWithParameters功能僅僅是因爲p標籤你正在努力尋找當時不存在。

+1

@charlietfl這不是放在這個錯誤引發的'p'標籤之後的函數執行。這是他發佈之後發佈的腳本,必須在加載「p」標籤之前執行。 – Linek

+0

謝謝,我會通讀這些信息。 – Tony

+0

謝謝,這很有幫助。它現在是有道理的,我想我應該已經意識到發生了什麼。 – Tony

0

您將變量z的值設置爲functionWithParameters的返回值。 因此,在函數functionWithParameters返回值 之前,變量z的值未定義。這是 ,因爲它在函數functionWithParameters返回值之前沒有得到任何值。

console.log不起作用的原因是 ,因爲您的腳本有一個活動錯誤,您的腳本必須停止。

+0

這絕對是正確的答案。 Z =功能「functionWithParemters」的返回值,因此z直到functionWithParemters返回一個值纔會定義。 –

+0

所以,在return語句執行之前z是未定義的。在函數內部,由於相同的原因,z顯示爲未定義。 我還在HTML頭標記中加載了javascript。我應該把它裝進身體嗎? – Tony

+0

@Tony這就是我的答案,你的代碼在加載「p」標籤之前執行,因此它在第一次函數運行時不存在,一旦你閱讀了我在答案中鏈接的答案,就會理解它。 – Linek

0
TypeError: document.getElementById(...) is null[Learn More] (from Firefox) 

功能是拋出一個異常,那麼z永遠無法得到的值。造成這種例外的原因是,您正在嘗試在文檔加載完成之前訪問元素。

解決此問題的一個簡單方法是將腳本加載到html文件的底部(在</body>之前)。

0

您不理解函數執行流程。

 var z = functionWithParameters(4, 3); 
     //call functionwithParamarters,and run into function body, 
     //at this time the value of z is undefined, 
     //the if statement block is not executed,then output z is undefined. 
     //after call functionWithParameters ,z is 12 
     function functionWithParameters(x, y) { 
      if (typeof z !== "undefined") { 
       document.getElementById("functionWithParameters").innerHTML = z; 
       console.log('inside function: ' + z); 
       console.log('inside function: z is a ' + typeof z); 
      } 
      console.log('before return: z = ' + z); 
      return x * y; 
     } 
     console.log('outside function: z = ' + z); 
     //at this line z is 12 
     functionWithParameters(10, 10); 
     //z still is 12 , calling functionWithParameters dont change value of z 
     //and if statement block is executed.