記事ディレクトリ
1. 範囲
- スコープの概念: 変数または関数またはデータまたは関数、動作範囲、影響範囲、使用可能な範囲
- 範囲の分類:
- グローバル スコープ: どの関数にも属さないステートメントはグローバル スコープと呼ばれます。グローバル スコープ内の変数はグローバル変数と呼ばれます。
- ローカルスコープ: 関数が属する領域をローカルスコープといいます。ローカル スコープ内の変数はローカル変数と呼ばれます。
- スコープ間のデータのアクセス ルール (スコープのネスト後)
- 親スコープは子スコープ内のデータを使用できません(親は子にアクセスできません)。
- 子スコープは親スコープ内のデータを使用できます(子は親を取得できます)。
var a = 10; function fn(){ var b = 20; console.log(a); // 10 console.log(b); // 20 } fn(); console.log(a); // 10 console.log(b); // Error: b is not defined
- マルチレベルのスコープのネスト後の変数の読み取りおよび書き込みルール
- 読む(使う):
- まず独自のスコープ内で検索し、それを使用し、見つかった場合は検索を停止します。
- 見つからない場合は、上位スコープを順番に検索します
- レイヤーが見つかった場合は、それを使用して検索を停止します
- 最上層まで見つからず、エラーを報告しました。
- 書き込み(割り当て):
- まず独自のスコープ内で検索し、見つかった場合は変更して検索を停止します。
- 見つからない場合は、上位スコープを順番に検索します
- レイヤーが見つかった場合は、それを変更して検索を停止します
- 最上位レベルまで見つからなかったので、グローバルとして宣言してから変更するだけです。(非厳密モードでは、厳密モードではエラーが報告されます)
- 読む(使う):
- さまざまなスコープの変数の特性
- グローバル変数: グローバル環境に従い、常にメモリ内に存在し、メモリを占有します。
- ローカル変数: ローカル環境に従って、ローカル スコープが作成され、変数が存在し、ローカル スコープが終了し、変数が削除され、メモリが節約されます。
- 提案: グローバルの使用をできるだけ少なくし、匿名関数を使用して大きな新しいスコープを生成し、データと複数の関数をラップして再度使用するようにします。
;(function(){ var a = 10; function box1(){ console.log(a); // 10 } function box2(){ a = 20; console.log(a); // 20 } function box3(){ console.log(a); // 20 } box1(); box2(); box3(); })();
2. ステートメントの改善
- いわゆるステートメントのプロモーションとは、JS パーサーが JS コードを解析するときに、まず現在のスコープ内の変数宣言と関数宣言を、実行するスコープの先頭に進めます。これは、対応するスペースをメモリ内に作成することを意味します。将来的にプログラムを直接使用できるようにするため。
- しかし、これは実際には js 言語に存在するバグであり、早期に宣言する利点は非常に小さく、逆にブロックレベルのスコープの概念がないと、さまざまなスコープ空間の汚染を引き起こすことになります。そのため、後のバージョン ES6 の新機能では、変数宣言の昇格が禁止されています。
- 宣言された変数の巻き上げ
- var で宣言された変数はスコープの先頭で事前に宣言され、その場で代入されます。
console.log(a); // undefined var a = 10; console.log(a); // 10
- var で宣言された変数はスコープの先頭で事前に宣言され、その場で代入されます。
- 宣言された関数の巻き上げ
- function で宣言された関数は、全体としてスコープの先頭に昇格されます。
console.log(fn); // function fn(){...} function fn(){ console.log(1) } console.log(fn); // function fn(){...}
- function で宣言された関数は、全体としてスコープの先頭に昇格されます。
- var が function と一致するとき
- 代入作成関数: var fn = function(){}
- 変数はプロモートされますが、関数はプロモートされません
console.log(fun); // undefined var fun = function(){ console.log(2) } console.log(fun); // function(){...}
- 変数はプロモートされますが、関数はプロモートされません
- var の変数名が function の関数名と同じ場合、var が先にプロモートされるため、function が有効になります。
- 注: 重複した名前は許可されません。
console.log(b); // function b(){...} var b = 20; function b(){ console.log(3); } console.log(b); // 20
- 注: 重複した名前は許可されません。
- 代入作成関数: var fn = function(){}
3. 再帰
- 再帰: 関数内でそれ自体を実行します。再帰を悪用すると、無限ループに似た現象が発生し、プログラムのクラッシュ、コンピューターのクラッシュ、メモリ オーバーフローが発生します。
- 再帰の考え方を使用してプログラムの問題を解決し、関数の end ステートメントと連携し、必要に応じて再帰から抜け出します。
- 通常の再帰でも多くのパフォーマンスを消費します
- 使わなければならないときはできるだけ使わず、最小限で使えるときは使わない
- 引き渡す:
- 自己永続的なプロセス
- 戻る:
- 継続的にデータを外部に返すプロセス
- 再帰を使用して階乗を計算します (5! = 5 4 3 2 1) 。
// 已知:
// 5! = 5 * 4 * 3 * 2 * 1
// 5! = 5 * 4!
// 4! = 4 * 3!
// 3! = 3 * 2!
// 2! = 2 * 1!
// 1
// 可推算计算任意数的阶乘公式为:
// fn(n) = n * fn(n-1);
// ...
// fn(5) = 5 * fn(4);
// fn(4) = 4 * fn(3);
// fn(3) = 3 * fn(2);
// fn(2) = 2 * fn(1);
// 计算最小数字1的阶乘为:
// fn(1) = 1;
function fn(n){
if(n === 1){
return 1;
}else{
return n * fn(n-1);
}
}
console.log( fn(5) ); // 120
4. オブジェクトの紹介
-
オブジェクト: 客観的な物事の記述、論理的なデータの形式で客観的な物事を記述するプロセス
- 順序付けされていないデータのパッケージング、オブジェクト オブジェクト、フラグは
{}
- 順序付けされたデータ、配列オブジェクト、フラグのパッキングは、
[]
- 順序付けされていないデータのパッケージング、オブジェクト オブジェクト、フラグは
-
オブジェクトの性質(組成)
- キーと値のペア。Key(キー)とValue(値)は1対1に対応し、ペアで表示されます。
- コロンはキーと値を接続するために使用され、カンマはキーと値のペアを区切るために使用されます。疑似コード:
{ 颜色:红色, 身高:180, 体重:150, 发型:板寸 }
-
オブジェクトの意味(機能):データの保存、プログラミング
-
オブジェクトの作成
- リテラル:
var obj = {}
- コンストラクタ:
var obj = new Object()
- リテラル:
-
いずれの場合も、2 つのオブジェクトは等しくありません。等しい場合、それは 1 つのオブジェクトであることを意味します。
var obj1 = { }; var obj2 = new Object(); var obj3 = { } var obj4 = obj1; console.log(obj1); // {} console.log(obj2); // {} console.log(obj1 === obj2); // false console.log(obj1 === obj3); // false console.log(obj4 === obj1); // true
-
オブジェクト操作構文
- ドット構文: オブジェクトのプロパティが具体的な値の場合
- 括弧の構文: オブジェクトのプロパティが変数の場合
var a = "world"; var obj = { title:"对象的操作", number:18, [a]:"啊哈哈哈" } var str = "number"; console.log( obj.str ); // undefined console.log( obj[str] ); // 18 console.log( obj.a ); // undefined console.log( obj.world ); // 啊哈哈哈 console.log( obj["title"] ); // 对象的操作 console.log( obj[title] ); // Error: title is not defined
-
オブジェクト操作
var person = { name:"张三", age:18};
- 増加:
person.sex = "男"; person["sex"] = "男";
- 消去:
delete person.age; delete person["age"];
- 変化
person.sex = "女"; person["sex"] = "女";
- チェック
console.log(person.name) console.log(person["name"])
- 増加:
-
オブジェクトの分類 (理解)
- ホスト オブジェクト:
window
、document
- ローカル オブジェクト: コンストラクター。特定のオブジェクトを取得するには newを実行する必要があります:
Object
、、、、Number
String
Boolean
- 組み込みオブジェクト: 直接使用できる公式に提供されたオブジェクト:
Math
- ホスト オブジェクト:
5. 練習する
- 再帰を使用して解決する関数を作成する
- n が偶数の場合、関数を呼び出して 1/2+1/4+...+1/n を求めます。
- n が奇数の場合、関数を呼び出して 1/1+1/3+...+1/n を求めます。
- 再帰を使用して 2 つの数値の最大公約数を見つけます
- 再帰を使用して、フィボナッチ数列の n 番目の桁 (1、1、2、3、5、8、13、21、...) を見つけます。