2017-02-21 7 views
1

私は、実行するのと同じ行に宣言された変数を使用する関数の中に "x変数が定義されていません"というエラーが表示されるのでしょうか?関数。スニペット(ES6)関数実行のletで定義された変数を使用する関数

let timeout = resetTimeout(); 

function resetTimeout() { timeout = 0; return timeout } 

ここでスコーピングはなぜ機能していますか?変数は関数定義の前に定義されているので、なぜですか?

EDIT 問題を明確にするために、私はそれがvarで動作することを知っています。私はletとconstのスコープについて既に読んでおり、なぜこれが期待通りに動作しないのか理解できません。私が探しているのは解答ではなく解説です。

+0

'var'は動作しますか? – AshBringer

+0

もちろん、varは動作します、なぜそれが失敗するのですか? – Danielo515

答えて

2

letを使用して変数を作成し、直ちに関数の戻り値を割り当てます。これは大丈夫です。

問題は機能の中にあります。可変タイムアウト(= 0)のタイプを指定しなければ、let beforeを使って定義されたタイムアウトと同じタイムアウトを扱います。したがって、循環参照があります。

1 - ファーストラインは関数を呼び出し、タイムアウトはスコープ内に作成されますが、値は未定義です。

2 - 関数本体で 'timeout'が0に設定されています。スコープ内にあるため、jsはグローバル変数を作成できません(通常は実行されます)。

修正?ファンクションブロック内のタイムアウトをローカルにしたい場合は、名前を変更してください。

letを使用しても問題ありません。

+0

本当にありがとうございます。しかし、私はまだ関数がなぜ外側のスコープで宣言された変数を見ていないのか理解していません。これは、式が完了するまで変数が宣言されているとはみなされないという事実と関係しているかもしれません。関数は変数宣言に依存しているので、何らかの依存関係ループが作成され、式は完了できません。しかし、これは純粋な推測であり、私はこれを確認するソースを持っていないので、私はここでstackoverflowに尋ねた。私が言っていることが意味をなさないかどうか知っていますか? – Danielo515

+0

私にもちょっと変わっています。関数ブロックの上に宣言された変数は、varまたはletを使って差をつけてはいけません。たぶんもっと詳しい説明がここにあります。これまでのところ、あなたは、この動作が実装者によって意図されたものではない場合、この奇妙さを露呈させる興味深いパラドックスを作成したようです。 –

+0

再度ありがとうございました。私はこの奇妙な行動を報告できる場所を知っていますか? – Danielo515

-1

あなたのアップデートとこの男の答えを考慮して、変数の名前を変更する必要はないと述べたいと思います。 letは1つのレイヤー上でしか動作せず、スコープ内に深く進まないので、関数内で新しい可変タイムアウトを宣言することができます。

let timeout = resetTimeout();

function resetTimeout(){let timeout = 0;戻りタイムアウト。 }

少し助けてくれることを願っています。以前の回答をお詫び申し上げます。

+1

私はそれがvarで動作することを知っています。私はスコープについて既に読んでおり、私が期待しているようにこれがなぜうまくいかないのか理解できません。私が探しているのは解答ではなく解説です。 – Danielo515

+0

本当の問題ではありません。 –

+0

@ Danielo515申し訳ありませんが、私はあなたを理解できませんでした。 Bulentが言っていたように、関数内でローカルの関数内でタイムアウトをしたいのであれば、timeout = 0ではなく、名前を変更する必要はありません。この関数では、let timeout = 0と書いてください。あなたを少し助けてくれることを願っています。 –

関連する問題