プロが教えるわが家の防犯対策術!

JavaScriptの勉強をしています。
問題集の例題をカスタマイズして、
以下のようにコードを作成しました。

とりあえず動くのですが、最後の
console.log(tax);

の出力が
ReferenceError: tax is not defined
になります。

コードの中では、taxが0.08で演算されており、
totalの値もちゃんと出力されるのですが、
なぜ最後のコンソールログで「tax」だけエラーになるのでしょうか?

詳し方、説明の上手な方、お手数ですが、教えて下さい。

<script>
var total = function(price) {
var tax = 0.08;
return price * tax price;
}

console.log(total(8000));
console.log(tax);
</script>

A 回答 (5件)

こんんちは



「変数のスコープ」について考えてみるのが宜しいかと。

以下に、ほぼ同じような例を挙げての説明がありますので、わかりやすいかも。
https://developer.mozilla.org/ja/docs/Web/JavaSc …

このあたりも参考になるかも
https://developer.mozilla.org/ja/docs/Web/JavaSc …

おまけで、関数のスコープ
https://developer.mozilla.org/ja/docs/Web/JavaSc …
    • good
    • 1
この回答へのお礼

ありがとう

解答して頂きありがとうございます。

https://mzl.la/2VbhoDB

1. 宣言した変数は、その変数を宣言した実行コンテキストの内部にあるとみなされます。
宣言していない変数は、常にグローバルになります。

ということなので、

var total = function(price) //スコープ外で宣言しているからグローバル

{ var tax = 0.08; //スコープ内で宣言しているから、実行コンテキストの内部のみで有効。

ということですね。よくわかりました。

今回は解答して頂きありがとうございます。
機会がありましたら、またお願いします。

※質問はしばらくあけておきます。

お礼日時:2018/12/26 10:41

なんだよ!「スコープ」なんて横文字使うからこうなるんだよ


中括弧で囲まれた中で宣言したものは。その中でしか使えないんだよ。
俺は、今でもそういう覚え方だ!^^;
    • good
    • 1
この回答へのお礼

Thank you

解答して頂きありがとうございます。

>中括弧で囲まれた中で宣言したものは。その中でしか使えないんだよ。

これが一番シンプルでわかりやすいですね。
解答ありがとうございます。
機会があればまたお願いします。

お礼日時:2018/12/26 10:47

>だったらどうして、同じようにスコープ外にある


>console.log(total(8000));

>は機能するのかな?と思いました。
>どちらもスコープ外にあるのですが、

同じではありません。

total の宣言(var)が存在するのは <script> の直下です。total の有効範囲(スコープ)は </script> までです。

tax の宣言が存在するのは、function(price) { の中です。tax の有効範囲は function(price) { の対になる } までです。
    • good
    • 1
この回答へのお礼

Thank you

解答して頂きありがとうございます。

初心者なので、

>変数のスコープ外だからです。

のご返答で、そこまで理解するのは無理でした。

今回はいろんな方に教えて頂き、よくわかりました。

何度も、解答して頂きありがとうございます。
機会がありましたら、またお願いします。

お礼日時:2018/12/26 10:47

JavaScriptの勉強をしているのならば尚更


定数として扱われる const でしょう

const TAX = 0.08;
let total = (price) => price * TAX |0; // |0は蛇足
    • good
    • 1
この回答へのお礼

解答して頂きありがとうございます。

説明足らずですいません。
JavaScriptの勉強を始めてまだ1カ月たっておらず、
今回、教えて頂いた「const 」というのは
初めて見ました。

軽く調べてみたのですが、
https://bit.ly/2Smbb60

今の私では全く意味が理解できません。

No1さんのご解答のとおり、

const TAX = 0.08;
let total = (price) => price * TAX |0; // |0は蛇足

とスコープ外で機能するconsole.logと機能しないものがあるのと
何か関係があるのでしょうか?

console.log(total(8000)); //動作する
console.log(tax); //エラーになる?なんで?

理由をご存じでしたら、説明して頂けたらうれしいです。

ご面倒でしたら、スルーでOKです。

今回は解答して頂きありがとうございます。

お礼日時:2018/12/26 10:15

変数のスコープ外だからです。

    • good
    • 1
この回答へのお礼

解答して頂きありがとうございます。

>変数のスコープ外だからです。

}の範囲外だから、、、。ということだと思います。
それは理解できます。

だったらどうして、同じようにスコープ外にある
console.log(total(8000));

は機能するのかな?と思いました。
どちらもスコープ外にあるのですが、

どうして、

console.log(total(8000));
だけ機能して、

console.log(tax);
はエラーになるのかな?

と思い、質問させて頂きました。

聞き方が下手ですいません。

もし何か理由があり、ご説明できるようでしたら、
教えて頂ければうれしいです。

ご面倒なら、スルーでOKです。

今回は解答して頂きありがとうございます。

お礼日時:2018/12/26 10:06

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!