1。JSのメモリスペースは、スタックメモリとヒープメモリの2つのタイプに分割されます
スタックメモリ:JSコード実行の環境を提供します。基本データ型の値を保存します。 - >グローバルスコープまたはプライベートスコープは実際にはスタックメモリです
ヒープメモリ:参照データ型の値を保存します(オブジェクトは属性名と属性値を保存し、関数は関数本文にコードを文字列として保存します)
2.ブラウザがHTMLページをロードすると、最初にJSコード実行の環境が提供されます - >グローバルスコープ(グローバル - >ウィンドウ)
3。JSコードが実行される前に、ブラウザはそれ自体でいくつかのことを行う必要があります。すべてのvar/functionキーワードを事前に宣言または定義します - > "pre -explanation"(variable sound)
宣言 - > var num1などのそのようなものがあることをブラウザに伝えます。関数fn;
定義 - >宣言された変数または関数に値を割り当てます。たとえば、num1 = 12; fn = function(){}
[重要]変数は定義されていないことを宣言するだけで、デフォルト値は未定義です(未定義)
4. VARと機能の処理は、事前解釈段階で異なります。
var->プレープレーニングが実行されると、変数は事前に宣言されます。割り当て操作は、コードが実行されたときにのみ完了します。
関数 - >実験前に、すべての宣言と定義は事前に完了します(コードが実行されると、直接スキップされます)
[重要な]最初は、ウィンドウで事前解釈のみが実行されます。 FN関数に保存されている現在の文字列はすべて文字列であるため、VAR合計には実用的な意味がないため、事前解釈は実行されません - >「現在の範囲で事前解釈が発生します」
console.log(obj); //->未定義のvar obj = {name: "Zhang Shanshan"、age:10};関数fn(num1、num2){//コードがこの行に実行されるときに直接スキップします。 console.log(合計); } var num1 = 12; fn(num1、100); // fnを実行し、グローバル変数num1の値をパラメーターnum1に割り当て、パラメーターnum2に100を割り当てます5.グローバルスコープで宣言された変数は、グローバル変数です
プライベートスコープで宣言された変数は、プライベート変数です。関数の正式なパラメーターも私的変数です。
関数に表示される変数がプライベートなのかグローバルなのかを知る方法は?
まず、それが正式なパラメーターであるかどうかを確認し、プライベートスコープで宣言されているかどうかを確認します(Vared)。 2つのうちの1つはプライベート変数です。それから、現在の関数のどこに表示されても、それはプライベートであり、それとグローバルなものとの間に関係はありません。どちらもそうでない場合、それはプライベートではないことを意味し、以前の範囲を検索します...
6.関数が実行されると、関数本文のコードが実行される新しいプライベートスコープ(スタックメモリ)が形成されます。
1)正式なパラメーターに値を割り当てます
2)プライベートスコープでの事前解釈
3)プライベートスコープでのコード実行
形成された新しいプライベートスコープは、外部の影響から内部のプライベート変数も保護します。関数のこの保護メカニズム - > "閉鎖を挿入します
違い:VARを使用している人は、コードが実行される前に宣言できますが、VARのない人は事前に宣言することはできません
1.条件が真実かどうかに関係なく、事前に実現する必要があります。
ウィンドウの事前実験:var a; - > window.a; if(!( "a" in window)){// "a" in Window-> true var a = "us"; } console.log(a); //->未定義2。事前解釈は「=」の左側でのみ発生し、左側のみが事前解釈であり、右側は事前解釈なしの値です。
匿名関数の関数表現:関数定義の部分を、変数または要素であるイベントの値として割り当てます。
実験前の場合:var fn; - > FNのデフォルト値は未定義です
fn(); //-> undefined()Uncaught TypeError:fnはjs &&上記の上記のコードがJSで実行できる関数のみを実行できます。 }; fn();事前に実現する場合:fn = xxxfff000 fn(); // - > "ok" function fn(){console.log( "ok"); } fn(); // - > "ok" function fn(){console.log( "ok"); } fn(); //-> "ok"3.関数本文の返品以下のコードは実行されなくなりましたが、以下のコードはプリプレーニングに参加する必要があります。また、返品の背後にあるものを処理する必要がありますが、値として返されるため、実験前は実行されません。
var total = 300; function fn(){console.log(total); return function sum(){}; // returnは関数の値を関数の外側に返すことになります。これは、関数の外側に対応するメモリアドレスを返します。たとえば、xxxfff111を返します。関数本文の以下のコードがvar total = 10を実行していません。 } fn();4.匿名関数の関数は、グローバル範囲で事前に説明されていません。
匿名関数の自己実行機能:定義と実行が一緒に完了します
(function(num){})(100);
5.プラネーション前の場合、名前が繰り返される場合、それは一度だけ宣言され、繰り返されませんが、割り当ては繰り返されます。
変数の名前と関数の名前がJSの関数の名前と同じ場合、繰り返されると見なされます
実験前:
var fn; fn = xxxfff000を宣言します。 [宣言] + fn = xxxfff111を定義しないでください。 [宣言] +定義ではない - > fn = xxxfff111 var fn = 12; // window.fn = 12 function fn(){//window.fn=function(){}} function fn(){}上記は、編集者からもたらされたJSの事前概要に関するすべての関連する理解です。 wulin.comをもっとサポートしてくれることを願っています〜