で失われました。私はcontの名前を変更しようとしましたが、値を変更していたものを見落としていたと思っていましたが、それもうまくいきませんでした。機能を実行した後ローカル変数は、変数CONTは、以下で失われている閉鎖
、私は当初、この閉鎖を作成し、それは私の知る限り失われたオブジェクト参照の問題ではありませんので、続きはまだ定義されている文脈で続きを確認してください。
で失われました。私はcontの名前を変更しようとしましたが、値を変更していたものを見落としていたと思っていましたが、それもうまくいきませんでした。機能を実行した後ローカル変数は、変数CONTは、以下で失われている閉鎖
、私は当初、この閉鎖を作成し、それは私の知る限り失われたオブジェクト参照の問題ではありませんので、続きはまだ定義されている文脈で続きを確認してください。
おそらく、非常に単純化した例では、問題がより明白になるだろう:
var outer = function(theVariable) {
console.log("In the outer function, theVariable is", theVariable);
var inner = function() {
console.log("In the inner function, theVariable is", theVariable);
if (false) {
var theVariable = 2;
}
};
inner();
}
outer(1)
In the outer function, theVariable is 1
In the inner function, theVariable is undefined
あなたが見てきたように、同じ名前を持つ別の変数は、内側に(初期化されていないにもかかわらず)宣言されたという事実を関数は、外部関数内で適切に初期化された変数を表示します。
あなたは変数がブロック内で宣言されているので、それは機能の他の部分に影響を与えないだろうと思うかもしれません。いいえ、var
は機能スコープであり、ブロックスコープではありません。
この欠陥は現代版のJavascriptで解決されており、var
キーワードは、予期したブロック範囲を持つlet
に置き換えられました。 var
は下位互換性を保ちますが、新しいコードでは使用しないでください。
私は彼がブロックが関係していると思ったのではないと思っていますが、 'console'ログの後に' var'文が実行されただけです。 Hoistingは 'var'宣言の位置を無関係にします。 – Barmar
alertを使用する代わりに 'console.log(...)'を試してください。それはあなたの人生を楽にし、あなたはそれを後悔しません。 – RobB
あなたのコードは実際にその関数の中に 'alert(cont)'を持っていますか、デバッグ中にコンソールでそのコードを実行しようとしましたか?私はこれが起こっているようなものがあると思う:http://stackoverflow.com/a/21918024/1715579 –
私は現在実行中のconsole.logメッセージの膨大な数のために、値をテストするためにアラートを追加しました:P –