2017-04-09 14 views
-4

私はJavaScriptを初めて使いました。なぜなら、「z」がなぜ定義されていないのか理解しようとしています。なぜこれは「未定義」ですか?

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 

:!(typeof演算Z == '未定義の' の場合)、コード結果は次のようになります。

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機能:z = '+ z)。実行されません。私は関数がreturnステートメントを持っているからですが、戻り値をコメントアウトしても結果は変わらないからです。

これを理解する助けがあれば素晴らしいと思います。 フィードバックいただきありがとうございます。

+0

私の推測は、バリホイストです。したがって、 'z'は値が与えられず、未定義です。 – Li357

+0

論理は意味をなさない。関数の返り値に依存する変数は、その関数の中でどのように定義できますか? – charlietfl

+0

@charlietflこの例についてはわかりませんが、繰り返し関係アルゴリズムでは意味があります。 – Linek

答えて

1

このStack Overflowは、DOMがロード/実行される順序に関する質問に答えます。

あなたが書いた:私は削除した場合

を:(!typeof演算Z == '未定義')場合 [..]、とのコードの結果をライン:はconsole.log( '外の機能: z = '+ z)である。実行されません。私は関数がreturnステートメントを持っているからですが、戻り値をコメントアウトしても結果は変わらないからです。 pタグがロードされる前に、あなたが見つけようとしているpタグが一度に存在していないという理由だけで、エラーをスローdocument.getElementById("functionWithParameters")にもたらされるfunctionWithParameters機能を実行するためだ

+1

@charlietflこのエラーを投げているのは 'p'タグの後に置かれた関数の実行ではありません。 'p'タグがロードされる前に実行されていなければならなかったスクリプトの後に投稿したスクリプトです。 – Linek

+0

ありがとう、私はこの情報を読むでしょう。 – Tony

+0

ありがとう、これは役に立ちました。今は意味があり、何が起こっているのか分かっていたはずです。 – Tony

0

変数zの値をfunctionWithParametersの戻り値として設定します。 したがって、関数functionWithParametersが値を返す前に、変数zの値は未定義です。 functionWithParametersが値を返す前に値を取得しなかったので、これは です。

console.logが機能しない理由は、 です。スクリプトにアクティブなエラーがあり、スクリプトを停止する必要があるためです。

+0

これは正解です。 Z =関数 "functionWithParemters"の戻り値したがって、functionWithParemtersが値を返すまでは未定義です。 –

+0

したがって、returnステートメントが実行されるまで、zは未定義です。関数内では、zは同じ理由で未定義と表示されます。 私はHTMLのheadタグにも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. 
関連する問題