JS事前解釈の詳細な解釈

亚连
亚连オリジナル
2018-05-21 09:19:051396ブラウズ

ここで、JS 事前解釈についての適切な理解を提供します。今からそれを皆さんと共有し、皆さんの参考にしてください。

1. JS のメモリ空間はスタック メモリとヒープ メモリの 2 つのタイプに分けられます

スタック メモリ: JS コード実行のための環境を提供します。 private role フィールドは実際にはスタックメモリです

ヒープメモリ: 参照データ型の値を格納します (オブジェクトは属性名と属性値を格納し、関数は関数本体のコードを文字列として格納します)

2. ブラウザのロード時HTML ページでは、まず JS コード実行のための環境を提供します -> グローバル スコープ (グローバル -> ウィンドウ)

3. JS コードが実行される前に、ブラウザーはいくつかのことを独自に実行する必要があります。事前に var/function キーワードですべてを定義します -> 「事前解釈」 (変数宣言)

宣言 (宣言) -> var num1; などのようなものがあることをブラウザに伝えます。

定義 (定義済み) -> 宣言した変数または関数に値を代入します (例: num1=12; fn=function(){}

[重要] 変数は宣言されただけで定義されていません。は未定義です(未定義)

4. 変数と関数は、解釈前段階で別々に処理されます

var -> この変数は、解釈前に事前に宣言されるだけであり、代入は操作

関数 -> 事前解釈時に宣言と定義が完了しています(コード実行時は、定義したコードは直接スキップされます)

【重要】事前解釈を実行します。現在、fn 関数に格納されている文字列はすべて文字列であるため、var total には実際的な意味はなく、事前解釈は現在のスコープで実行されません。

console.log(obj);//->undefined
 var obj = {name: "张珊珊", age: 10};
 function fn(num1, num2) {//代码执行到这一行的时候直接的跳过,因为在预解释的时候我们已经完成了声明加定义
var total = num1 + num2;
 console.log(total);
 }
 var num1 = 12;

 fn(num1, 100);//执行fn,把全局变量num1的值赋值给形参num1,把100赋值给形参num2

5、グローバル スコープで宣言された変数はグローバル変数です

プライベート スコープで宣言された変数もプライベート変数です。

関数の仮パラメーターもプライベート変数です。関数はプライベートかグローバルですか?

最初にそれが仮パラメータであるかどうかを確認し、次にプライベート スコープで宣言されているかどうか (var があるかどうか) を確認します。2 つのうちの 1 つがプライベート変数である場合、それはプライベート変数になります。現在の関数のどこに出現しても、グローバル関数とは関係がありません。どちらも存在しない場合は、その上位レベルのスコープで検索します。関数が実行されると、関数本体のコード実行用に新しいプライベート スコープ (スタック メモリ) が形成されます

1) 仮パラメータに値を代入します 2) プライベート スコープでの事前解釈 3) の実行プライベート スコープ内のコードは、新しいプライベート スコープを形成します。プライベート スコープは、関数のこの保護メカニズムを使用して、内部のプライベート変数を外部から保護します。 var なしでは事前に宣言できません


1. 条件が true であるかどうかに関係なく、事前解釈が必要です

window预解释:var a; -> window.a;
 if (!("a" in window)) {//"a" in window -> true
 var a = "我们";
 }
console.log(a);//->undefined

2. 事前解釈は、「=」の左側でのみ発生します。事前解釈され、右側が値です 事前解釈はありません

無名関数の関数式:関数定義部分を変数または要素に値を代入するイベントとして扱います事前解釈された場合: var fn; ->fn のデフォルト値は未定義です

fn();//->undefined() Uncaught TypeError: fn is not a function JS中只有函数可以执行 && JS上面的代码如果报错了,在不进行任何的特殊处理情况下我们下面的代码都不在执行了
var fn = function () {
 console.log("ok");
 };
 fn();

预解释的时候:fn=xxxfff000
 fn();//->"ok"
 function fn() {
 console.log("ok");
 }
 fn();//->"ok"

3. 関数本体内の return 以下のコードは実行されなくなりましたが、次のコードは事前解釈に参加する必要があり、return 以降は実行する必要があります。説明;

var total = 300;
 function fn() {
 console.log(total);
 return function sum() {};//return是把函数中的值返回到函数的外面,这里是把function对应的内存地址返回的到函数的外面,例如:return xxxfff111;函数体中return下面的代码都不在执行了
var total = 10;
 }
 fn();
4. 匿名関数の関数は、グローバル スコープでは事前解釈されません

の自己実行関数です。匿名関数: 定義と実行は同時に完了します

(function(num){})(100) ;

5. 事前解釈中に重複する名前が見つかった場合は、繰り返し宣言せずに 1 回だけ宣言します。代入はまだ繰り返される必要があります

JS で変数名と関数名が同じ場合、重複としてカウントされます

事前説明:

var fn; 声明
fn = xxxfff000; [声明]不要了+定义
fn = xxxfff111; [声明]不要了+定义
->fn=xxxfff111
 var fn = 12;//window.fn=12
 function fn() {//window.fn=function(){}
 }
 function fn() {
 }

上記は私が皆さんのためにコンパイルしたものです。将来みんなに役立つでしょう。

関連記事:

Js を使用して、配列内の 1 つ以上の項目を削除するいくつかのメソッドを実装する


js の組み込みオブジェクト Math のプロパティとメソッドについて詳しく説明します。一目)

JSON オブジェクト (グラフィック チュートリアル、シンプルかつ粗雑)

以上がJS事前解釈の詳細な解釈の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。