JavaScript_javascriptスキルにおけるvar宣言の変数スコープの推論について
次のコードを見てください:
for(var i=0;iconsole.log(j "," k); jvar k = j 1;
}
}
console.log(i);
,unknown
3, 3
3,3
3
C、Java、その他の言語で作業している場合、なぜ j や k などのローカル変数に外部のコードからアクセスできるのか不思議に思うかもしれません。範囲?
JavaScriptでvarで宣言した変数をローカル変数とみなせる場合、その変数にアクセスできるスコープは変数のローカルスコープとなります。上の例のように、console.log 行には j と k のスコープがまだあり、ループの外側には i のスコープがまだあります。現時点では、JavaScript には実際のローカル スコープがないと勝手に言えるかもしれません。本当に?いいえ!
2. 実際のローカル スコープを取得するにはどうすればよいですか?気になった書き方
皆さんは JQuery のソースコードや Ext のソースコードを見たことがあるかもしれませんし、次のような書き方に少しは馴染みがあるかもしれません。
var exports = (function() {
var a = 1,b=2;
return {a:a,b:b};
})(); log(" " a "," b);
console.log(exports.a "," exports.b);
出力結果:
1,2
関数内に独立したスコープがあるということは、非常に驚くべき発見です (実際には驚くべきことではありません。誰もが知っています)。つまり、関数内で var によって宣言された変数は関数内でのみ使用できます。関数。したがって、各フレームワークのすべてのマスターは、ローカル変数と外部変数 (外部ローカル変数とグローバル変数) の競合を防ぐためにこのように記述します。
この時点で、最初の記事の恣意的な推論を撤回して変更します。
JavaScript は関数によって制限されており、各関数には他のブロック (通常のコード ブロック、for ループ、If など) が含まれます。 、while および他のコード ブロック) にはローカル スコープがありません。var を使用して宣言された変数は、これらのコード ブロックを直接通過でき、外部コードからアクセスできます。
3. エラーはどのような場合に報告され、どのような場合に未定義になりますか? var の宣言メカニズム
コードを見てください:
出力結果:
出力結果:
未定義
return {a:a,b:b})();
出力結果:
参照エラー: a が定義されていません
推測:
4. 余談: クロージャーは非同期であり、変数の値がめちゃくちゃです。非同期状況でローカル変数の現在値を確実に転送するにはどうすればよいでしょうか?
コードについて話しましょう:
コードをコピーします
出力結果:
3
3
3
なぜですか?クロージャが非同期で実行されると、i は常に外側のスコープの i にアクセスします。非同期なので、クロージャが実行される時点でループは終了しており、i はすでに 3 なので、出力されるたびに 3 になります。
そうですね、誰かがこの書き方をしています:
コードをコピーします
出力結果:
2
2
2
なぜですか?
実際には、前に説明したように、j と i のスコープは実際には同じです。これらはすべて外部ローカル変数です。非同期状況でループの実行が完了すると、j は 2 (i は i より 1 小さい) になります。 (広告を想像してください(⊙v⊙))。
ご存知のとおり、関数内のパラメーターも関数のローカル変数とみなされます。そこで、ローカル変数を関数の実際のパラメータに変換し、値の転送の効果を実現する方法を紹介します。
setTimeout((
function(j){
return function() {
console.log(j);
}
})(i)
, 1);
}
0
1
2
実際、ここまで言うと、書くとほぼ理解できます。この無名関数メソッドを使用すると、非同期状況での変数変更の問題が解消されますが、これはこの投稿からの脱線です。
概要:
ええと。もう書きません。めんどくさいので、いつか時間を見つけて書きます。おいおい。
実際、これらの結論は RFC に書かれるべきです。でも英語の書類を噛み砕いて。 。 。忘れて。 。私はそれを自分で推測しました。ハハ、それを見て笑わないでください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









typedef struct は、構造体の使用を簡素化するために構造体型のエイリアスを作成するために C 言語で使用されます。構造体の別名を指定することで、新しいデータ型を既存の構造体に別名付けします。利点としては、可読性の向上、コードの再利用、型チェックなどが挙げられます。注: エイリアスを使用する前に構造体を定義する必要があります。エイリアスはプログラム内で一意であり、宣言されているスコープ内でのみ有効である必要があります。

Java における変数の期待値の例外は、変数の初期化、null 値の使用、およびローカル変数のスコープの認識によって解決できます。

JavaScript クロージャーの利点には、変数スコープの維持、モジュール化コードの有効化、遅延実行、およびイベント処理が含まれますが、欠点としては、メモリ リーク、複雑さの増加、パフォーマンスのオーバーヘッド、およびスコープ チェーンの影響が挙げられます。

C++ の #include プリプロセッサ ディレクティブは、外部ソース ファイルの内容を現在のソース ファイルに挿入し、その内容を現在のソース ファイル内の対応する場所にコピーします。主に、コード内で必要な宣言を含むヘッダー ファイルをインクルードするために使用されます。たとえば、標準入出力関数を組み込むための #include <iostream> などです。

C++ スマート ポインターのライフ サイクル: 作成: スマート ポインターは、メモリが割り当てられるときに作成されます。所有権の譲渡: 移動操作を通じて所有権を譲渡します。リリース: スマート ポインターがスコープ外に出るか、明示的に解放されると、メモリが解放されます。オブジェクトの破壊: ポイントされたオブジェクトが破壊されると、スマート ポインターは無効なポインターになります。

できる。 C++ では、ネストされた関数の定義と呼び出しが可能です。外部関数は組み込み関数を定義でき、内部関数はスコープ内で直接呼び出すことができます。ネストされた関数により、カプセル化、再利用性、スコープ制御が強化されます。ただし、内部関数は外部関数のローカル変数に直接アクセスすることはできず、戻り値の型は外部関数の宣言と一致している必要があります。内部関数は自己再帰的ではありません。

Vue では、let と var の間で変数を宣言するときのスコープに違いがあります。 スコープ: var にはグローバル スコープがあり、let にはブロック レベルのスコープがあります。ブロックレベルのスコープ: var はブロックレベルのスコープを作成しません。let はブロックレベルのスコープを作成します。再宣言: var は同じスコープ内の変数の再宣言を許可しますが、let は許可しません。

JavaScript では、this のポインティング タイプには、1. グローバル オブジェクト、2. 関数呼び出し、4. イベント ハンドラー、5. アロー関数 (this の外側の継承) が含まれます。さらに、bind()、call()、および apply() メソッドを使用して、これが何を指すかを明示的に設定できます。
