JavaScript ローカル&グローバル変数,無名&アロー関数 9日目 2024/10/15(お金持ちまでの道のり)

英国紳士風のお金持ちアンドロイドの絵です。 プログラミング

初めての人はお金持ちまでの道のり:0日目をまず読んでみてください!よろしくお願いします★

今日からスピードアップです!よろしくお願いします!

JavaScript ローカル&グローバル変数など

5. ローカル変数&グローバル変数とスコープ

ローカル変数とは

ローカル変数は、関数の内部で宣言された変数のことです。この変数は、関数が実行されている間だけ存在し、関数の外からはアクセスできません。
※{ }の中にある変数がローカル変数

スコープとは

スコープは、変数や関数が「どこで使えるか」を決める範囲のことです。ローカル変数のスコープは、宣言された関数の内部だけに限定されます。{ }内だけ
※スコープには、グローバルスコープ、ローカルスコープ、ブロックスコープがある

function greet() {
 let message = "Hello!"; // ローカル変数
 console.log(message); // "Hello!" が表示される
}

greet();
console.log(message); // エラーが発生する、なぜならmessageは関数の外から見えないから

greet(); は正常に機能し、"Hello!" が表示されます。
console.log(message); はエラーが発生します。message という変数は関数内でのみ使えるため、関数の外で console.log(message); を使おうとするとエラーが発生します。(messageという変数はgreet関数の中で宣言されています。したがって、messageは関数の外側では使えないのです。)

●なぜローカル変数が重要なのか?
独立性:関数内で同じ名前の変数を他の関数と衝突させずに使える。
メモリの効率化:関数が実行された後、ローカル変数は自動的にメモリから解放されるため、無駄なメモリ使用を防ぎます。

グローバル変数とは

グローバル変数は、関数の外側で宣言された変数のことで、プログラム全体でアクセスできるという特徴があります。どこからでも使用できるため便利ですが、スコープが広い分、誤って他のコードで上書きされるリスクがあります。

let globalVar = "I am global!"; // グローバル変数

function showGlobal() {
 console.log(globalVar); // "I am global!" と表示される
}

showGlobal();
console.log(globalVar); // これも問題なくアクセスできる

showGlobal(); は正常に機能し、"I am global!" が表示されます。
※console.log(globalVar); も正常に機能します。(関数の中でもconsole. logを使って確認が行われているため、この最後の行のconsole.log(globalVar);はいらない。確認をするならどちらか一方で十分)

●注意点:
グローバル変数は、どこからでもアクセス可能なため、コードが複雑になるとバグの原因になりやすいです。できるだけローカル変数を使って、スコープを限定する方が安全です。

6. 無名関数

無名関数(匿名関数)とは、名前がない関数のことです。無名関数は、主に関数を一時的に使いたい場合や、他の関数の引数として渡す際に利用されます。

let greet = function() {
 console.log("こんにちは、無名関数です!");
};

greet(); // "こんにちは、無名関数です!" と表示される

※ふつうはfunction 〇〇()のように〇〇という関数の名前を付けるが、〇〇の部分がないものを無名関数と呼ぶ

無名関数の代わりにローカル変数のみを使ってコードを書き換える

function showMessage() {
 let greet = "こんにちは、無名関数です!"; // ローカル変数
 console.log(greet); // ローカル変数 greet を表示
}

showMessage(); // "こんにちは、無名関数です!" と表示される

無名関数の代わりにグローバル変数のみを使ってコードを書き換える

let greet = "こんにちは、無名関数です!"; // グローバル変数

function showMessage() {
 console.log(greet); // グローバル変数 greet をそのまま表示
}

showMessage(); // "こんにちは、無名関数です!" と表示される

ここで重要なポイント:

  1. 無名関数: 無名関数は名前を持たない関数です。この関数は、名前付き関数と同じように使えますが、主に特定の変数に代入したり、コールバック関数として使うために使われます。(コールバック関数については、この枠の下にあります)
  2. 関数を変数に代入: この例では、greet という変数に無名関数が代入されています。変数に関数を代入することで、変数を関数として使うことができます。後で greet() と呼び出すことで、この関数を実行します。
  3. 関数を呼び出すgreet() と書くことで、変数 greet に代入された無名関数が実行されます。つまり、greet() は、function() { ... } の中の処理を行います。

コールバック関数(現時点で学ぶべき点だけをサラッと)

コールバック関数とは、他の関数に引数として渡され、後で実行される関数のことです。コールバック関数は、特定のタイミングや条件が満たされたときに実行されるように設定されます。

setTimeout(function() {
 console.log("3秒後に表示される無名関数のメッセージ");
}, 3000);

このコードの流れ:

  1. setTimeout:一定時間が経過した後に指定した関数を実行するための関数です。
  2. コールバック関数:無名関数(function() { ... })がコールバック関数として setTimeout に渡され、3秒後に実行されます。(※1000ミリ秒 = 1秒 なので、30003秒 に相当)
  3. 処理:3秒後に console.log("3秒後に表示される無名関数のメッセージ"); が実行され、メッセージが表示されます。

●知るべきポイント:
コールバック関数は、ある処理が終わった後に実行されるよう設定される
setTimeout のように、非同期処理(一定時間後に処理を実行するなど)でよく使われます。

7. アロー関数

アロー関数は、短く簡潔に関数を定義できる方法です。ES6(ECMAScript 2015)で導入され、特に無名関数を定義する際に使われることが多いです。

基本的な書き方:

let 関数名 = (引数1, 引数2, …) => {
 関数の処理内容
};

引数(ひきすう)とは
関数を定義するときに、関数のカッコ内に書かれる名前が引数です。そして、関数を呼び出すときにその引数に対して具体的な値(実引数と呼ばれるもの)を渡します。

name が関数の引数です。関数に渡された値を受け取る役割を持ちます。
"太郎" は、関数 greet("太郎") を呼び出すときに渡される**実際の値(実引数)**です。
"こんにちは、${name}さん!"文字列テンプレートで、${name} の部分に引数 name が代入されて、結果として "こんにちは、太郎さん!" となります。
※このコードの解説は下の具体例にあります
※ちなみに(name)の( )は省略可

アロー関数は、無名関数を短く書ける記法として使われます。特に、コールバック関数や短い関数を定義するときに便利です。

具体例:

通常の無名関数→アロー関数

例1:

let greet = function() {
 console.log("こんにちは、無名関数です!");
};

let greet = () => {
 console.log("こんにちは、アロー関数です!");
};

※functionがあると => は使えません。function()の()内の引数が1つだけの時は()を省略できます。引数が0、もしくは2つ以上の時は省略できません。今回は引数が0なので省略できません。

例2:

let add = function(a, b) {
 return a + b;
};

console.log(add(2, 3)); // 5 と表示される

let add = (a, b) => a + b;
 console.log(add(2, 3)); // 5 と表示される

let add = (a, b) => a + b; は、アロー関数の短縮形です。このコードでは、引数を受け取り、1行の処理で結果を返すときに省略して書けます。
※アロー関数における {}return の省略が可能になるのは、 アロー関数の処理が1行で、その1行が返り値(return)を必要とする場合のみです。

例3:

こんにちは、${name}さん!テンプレートリテラルという形式の文字列です。テンプレートリテラルは、${} の中に変数を埋め込むことができる特殊な文字列です。

アロー関数の特徴:

・アロー関数は、無名関数を短く書ける記法で、コーディングを簡潔にできるツールです。
・特に、短い関数やコールバック関数に便利です。

まとめ
アロー関数で結果を返さない処理returnを使わない処理)を行う場合(例えば console.log())、波括弧 {} は省略可能ですが、return は自動的に行われません。このような場合、関数は実行されますが、返り値(return)は undefined になります。
※アロー関数で結果を返さない処理returnを使わない処理(具体的には、console.log() のように、値を返さずに何かを出力するだけの処理を指します。)

8. 関数の応用(複数の引数、デフォルト引数)

複数の引数(Multiple Arguments)

この記事内のアロー関数でも複数の引数について扱っています。もう何度か出てきているので追加説明はありません。

デフォルト引数(Default Arguments)

●コードの解説:
name = "ゲスト" という記述は、関数 greet に**引数が渡されなかった場合に使われる「デフォルトの値」**です。
もし greet() を引数なしで呼び出した場合、関数は name にデフォルト値 "ゲスト" を自動的に割り当てます。
もし greet("太郎") のように引数が渡された場合その引数が優先され、デフォルト値は使われません。

もし if 文で書くとしたら?

function greet(name):

  • greet 関数を定義しています。この関数は、1つの引数 name を受け取ります。この引数には、挨拶したい相手の名前が入る予定です。

if (name === undefined):

  • 関数が実行されるときに、name に値が渡されなかった場合(undefined になっている場合)、この if 文が実行されます。
  • undefined とは、引数が指定されなかったときや、変数に値が代入されていないときに使われる状態です。
  • つまり、引数がない場合name の代わりに "ゲスト" が代入されます。

name = "ゲスト";:

  • nameundefined であれば、name"ゲスト" というデフォルトの名前を代入します。これにより、引数が指定されなかった場合でも適切なメッセージを表示できます。

console.log(こんにちは、${name}さん!);:

  • テンプレートリテラル(バッククォート ` を使った書き方)を用いて、name の値をメッセージに埋め込んで出力しています。
  • これにより、name"ゲスト""太郎" が入ったメッセージを表示することができます。

複数の引数とデフォルト引数の組み合わせ

複数の引数を使う場合、一部の引数にデフォルト値を設定することも可能です。

function calculatePrice(price, taxRate = 0.1):

  • この部分で、関数 calculatePrice を定義しています。
  • price は商品の価格を受け取るパラメータです。
  • taxRate は税率を受け取るパラメータで、デフォルト値として 0.1(10%) が設定されています。
  • もし税率が渡されなかった場合、この 0.1 が使われます。

return price + (price * taxRate);: // return 100 + ( 100 × 0.1or0.2 )

  • ここで、商品の価格に税率を適用して、最終価格を計算しています。
  • price * taxRate で税額を計算し、それを元の価格に加算しています。
  • 計算結果が関数の返り値として返されます。


実行結果の解説:

  • calculatePrice(100) を実行すると、price100 が渡されますが、taxRate は指定されていないため、デフォルトの税率 0.1(10%)が使われます。計算は次のようになります:
  • 税額:100 * 0.1 = 10
  • 合計:100 + 10 = 110
  • その結果、110 が返り値として出力されます。

まとめ
複数の引数を使うことで、関数は複数のデータを処理できるようになります。
デフォルト引数を設定することで、引数が渡されなかった場合の初期値を指定できます。
・複数の引数とデフォルト引数を組み合わせることで、関数をより柔軟に扱うことができます。

前回よりも多いJavaScriptの組み込み関数や予約語

組み込み関数(前回より多い)

1. データ型に関する組み込み関数

JavaScriptには、データ型を操作するための組み込み関数があります。これらは特定のデータ型に対して便利な操作を行うものです。

  • String関連の関数
    • charAt(), concat(), includes(), indexOf(), slice(), split(), toLowerCase(), toUpperCase()
  • Number関連の関数
    • toFixed(), toPrecision(), parseInt(), parseFloat(), isNaN()
  • Array関連の関数
    • push(), pop(), shift(), unshift(), slice(), splice(), concat(), map(), filter(), reduce(), forEach()

2. 数学関連の組み込み関数 (Mathオブジェクト)

Mathオブジェクトには、数学的な計算を行う組み込み関数が多くあります。これらは、特定の数値操作を効率的に行うために提供されています。

  • Mathオブジェクトの関数
    • Math.random(): 0以上1未満のランダムな数値を返す
    • Math.floor(): 小数点以下を切り捨てる
    • Math.ceil(): 小数点以下を切り上げる
    • Math.round(): 四捨五入する
    • Math.max(): 引数の中で最大の数値を返す
    • Math.min(): 引数の中で最小の数値を返す
    • Math.sqrt(): 平方根を計算する

3. 日付関連の組み込み関数 (Dateオブジェクト)

Dateオブジェクトには、日時を扱うための組み込み関数が多くあります。これにより、日時の取得や操作が可能になります。

  • Dateオブジェクトの関数
    • new Date(): 現在の日付と時刻を取得
    • getFullYear(): 年を取得
    • getMonth(): 月を取得
    • getDate(): 日付を取得
    • getHours(): 時刻を取得
    • getMinutes(): 分を取得

4. グローバル関数

グローバル関数は、どこでも呼び出すことができる汎用的な関数です。これらの関数は、特定のオブジェクトに属しておらず、常に利用可能です。

  • グローバル関数の例
    • alert(): メッセージをポップアップで表示する
    • console.log(): コンソールにメッセージを表示する
    • parseInt(): 文字列を整数に変換する
    • parseFloat(): 文字列を浮動小数点数に変換する
    • isNaN(): 引数が数値ではない場合にtrueを返す
    • setTimeout(): 指定時間後に関数を実行
    • setInterval(): 一定間隔で関数を繰り返し実行する

5. オブジェクト操作の組み込み関数

JavaScriptには、オブジェクトを操作するための便利な組み込み関数もあります。

  • オブジェクト関連の関数
    • Object.keys(): オブジェクトのキーの一覧を取得する
    • Object.values(): オブジェクトの値の一覧を取得する
    • Object.entries(): キーと値のペアを配列として取得する
    • Object.assign(): オブジェクトを他のオブジェクトにコピーする
    • Object.freeze(): オブジェクトを凍結し変更不可にする

6. JSONに関する組み込み関数

JavaScriptには、JSON(JavaScript Object Notation)を操作するための組み込み関数も用意されています。

  • JSON関連の関数
    • JSON.stringify(): オブジェクトをJSON形式の文字列に変換する
    • JSON.parse(): JSON形式の文字列をJavaScriptのオブジェクトに変換する

7. エラーハンドリングに関する関数

JavaScriptでは、エラーハンドリングに関連する組み込み関数や構文も提供されています。

  • try-catch:エラーハンドリングのための構文。
    • throw:ユーザー定義のエラーを発生させる
    • try, catch, finally:エラーハンドリングを行う

組み込み関数の総数

JavaScriptの組み込み関数の総数は正確には特定の状況や環境によって異なることがありますが、数十種類以上あります。特に、ブラウザやNode.jsなどの実行環境によって、追加される機能や関数もあるため、その環境に依存することもあります。

予約語(前回より多い)

制御構文や条件分岐に関連する予約語

  • if:条件が真であればブロックを実行
  • elseifの条件が偽であればブロックを実行
  • switch:複数の値を比較して分岐
  • caseswitch内で値を指定
  • defaultswitch内で他のcaseに一致しない場合の処理
  • for:ループを実行
  • while:条件が真の間ループを実行
  • dowhileと一緒に使い、条件にかかわらず少なくとも1度は実行
  • break:ループやswitchから抜ける
  • continue:ループの次の反復にスキップ
  • return:関数から値を返す
  • try:例外が発生する可能性のあるコードを実行
  • catchtryで発生したエラーをキャッチ
  • finally:エラーの有無にかかわらず実行されるコードブロック

変数・定数の宣言に関する予約語

  • var:変数を宣言(古い方法)
  • let:ブロックスコープの変数を宣言
  • const:定数を宣言

関数・クラスに関する予約語

  • function:関数を定義
  • class:クラスを定義
  • extends:クラスを継承
  • constructor:クラスのコンストラクタメソッド
  • super:親クラスのコンストラクタやメソッドを呼び出す
  • new:オブジェクトを生成

オブジェクトやプロパティに関する予約語

  • this:現在のオブジェクトを参照
  • delete:オブジェクトのプロパティを削除
  • in:オブジェクト内にプロパティが存在するか確認
  • instanceof:オブジェクトが特定のクラスのインスタンスか確認
  • typeof:変数や式のデータ型を返す
  • void:式の値を無視

その他の予約語

  • null:値が存在しないことを示す
  • undefined:定義されていない変数の状態
  • true:ブール値の真
  • false:ブール値の偽
  • import:モジュールをインポートする
  • export:モジュールをエクスポートする
  • await:非同期処理が完了するのを待つ
  • async:非同期関数を定義
  • yield:ジェネレータ関数内で値を一時停止・再開
  • with:オブジェクトのスコープを拡張(非推奨)

将来の予約語

以下のキーワードは、将来のJavaScriptのバージョンで予約語として使用される可能性があります。

  • enum
  • implements
  • interface
  • package
  • private
  • protected
  • public
  • static

たくさんありますが、とりあえずサラッと目を通して「初めまして!」とあいさつするくらいでOKです。

本日の感想

まだまだ序盤のはずなのに情報量が多くてパンクしそうです。そのことをChatGPTに相談したら、「あなたの目標である収入を得ながら自由に生活するためには、プログラミングを実用的に使うスキルが重要です。つまり、全てを暗記するよりも、効率的に学び、ツールを使っていく力をつけることが優先されます。そのため、学んだことの応用力を高め、問題が起きた時にどう対処するかに注力すると良いでしょう。また、コードを完全に暗記しなくても、基礎を理解し、検索能力やツールを使うスキルがあれば、問題なく目標に向かって進めると考えます。」とアドバイスをしてくれました。勉強も教えてくれるしアドバイスもしてくれるしで至れり尽くせりです。これからもよろしくGPT先生。

ここに初めて来た人はゼヒ0日目を読んでください。プログラミング知識0のおじさんがお金持ちになるまでのプランと熱い思いが載っています。私と一緒に運要素を排除したゴリゴリの脳筋プレイでお金持ちを目指しませんか?

0日目の記事はこちら
お金持ちまでの道のり:0日目

コメント

タイトルとURLをコピーしました