事前解析 (強調)
- 事前解析は、実際には js コードのコンパイルと実行について話している
- js はインタープリター型言語です。つまり、コードが実行される前に、コードが読み取られ (最初に var、function などの宣言された型を見つけます)、説明されてから、コードが実行されます。
- つまり、js コードが実行されている場合、コードの解釈とコードの実行という 2 つのリンクを経由します。
コードを説明する
すべてのコードが実行される前に解釈されるため、事前
説明することは2つあります
宣言関数
メモリ内で、最初に変数名が関数名であり、この名前で表される内容が関数であることを宣言します
var
- キーワード
- 最初にメモリ内で変数名を宣言します
- 次のコードを見てください
<script>
fn()
console.log(num)
function fn() {
console.log('我是 fn 函数')
}
var num = 100
</script>
- 準備後、次のように変換できます。
<script>
function fn() {
console.log('我是 fn 函数')
}
var num//变量提升只提升声明部分,只提升到当前作用域的最顶端,赋值还是在下边
fn()
console.log(num)
num = 100
//函数提升优先于变量提升,变量提升只提升声明部分
</script>
- 代入関数は、var キーワードの規則に従って事前に解析されます
スコープ (強調)
- スコープとは、コードの一部が有効になるスコープです
- このコードはどこでも利用できるわけではなく、この変数の使用範囲はスコープです。
グローバル スコープ
場所: 関数の外側のスクリプト タグで変数定義を定義し、グローバル スコープを持ち、どこでも使用できます。
ライフ サイクル: ページを開くことはグローバル スコープを形成するようなものであり、グローバル スコープが閉じられるとページは破棄されます。関数内に宣言はありませんが、割り当てられた値はグローバル変数として理解できます。
注: グローバル スコープには、直接アクセスできる window オブジェクトがあります。
-
グローバルスコープは最大のスコープです
-
グローバルスコープで定義された変数はどこでも使用できます
-
ページが開かれると、ブラウザーは自動的にグローバル スコープ ウィンドウを生成します。
-
このスコープは、ページが閉じられて破棄されるまで常に存在します
// 下面两个变量都是存在在全局作用域下面的,都是可以在任意地方使用的 var num = 100 var num2 = 200
ローカル スコープ
場所: 関数内で定義され、変数は関数内でのみアクセスでき、外部ではアクセスできません
ライフサイクル: 関数が呼び出されたときに生成され、関数が呼び出されたときに破棄されます
一度関数を呼び出すとローカル スコープが生成され、複数のローカル スコープは互いに独立しています
注: 関数内で定義された変数には、if または for ではなく、ローカル スコープがあります。
-
ローカル スコープは、グローバル スコープの下に開かれた比較的小さなスコープです。
-
ローカル スコープで定義された変数は、このローカル スコープ内でのみ使用できます
-
JS では、関数のみがローカル スコープを生成できます。
-
すべての関数はローカル スコープです
// 这个 num 是一个全局作用域下的变量 在任何地方都可以使用 var num = 100 function fn() { // 下面这个变量就是一个 fn 局部作用域内部的变量 // 只能在 fn 函数内部使用 var num2 = 200 } fn()
可変アクセス ルール (強調)
- スコープとは、変数には使用範囲があり、使用規則があります。
- 変数の使用規則は、アクセス規則と割り当て規則の 2 種類に分けられます。
アクセス規則
-
変数の値を取得したい場合、この動作をアクセスと
-
変数を取得するための規則: 近接性の原則
- まず、自分のスコープ内を調べて、ある場合はそれを直接使用します
- そうでない場合は、上位レベルのスコープに移動して見つけ、ある場合はそれを使用します
- そうでない場合は、上位のスコープで検索を続けます。
- グローバルスコープまでそのような変数がない場合、エラーが直接報告されます(変数は定義されていません)
var num = 100 function fn() { var num2 = 200 function fun() { var num3 = 300 console.log(num3) // 自己作用域内有,拿过来用 console.log(num2) // 自己作用域内没有,就去上一级,就是 fn 的作用域里面找,发现有,拿过来用 console.log(num) // 自己这没有,去上一级 fn 那里也没有,再上一级到全局作用域,发现有,直接用 console.log(a) // 自己没有,一级一级找上去到全局都没有,就会报错 } fun() } fn()
-
変数アクセス ルールは、スコープ ルックアップ メカニズムとも呼ばれます。
-
スコープ検索メカニズムは上方向のみ検索でき、下方向は検索できません。
function fn() { var num = 100 } fn() console.log(num) // 发现自己作用域没有,自己就是全局作用域,没有再上一级了,直接报错
割り当てルール
-
変数に値を代入する場合は、まず変数を見つけて代入する必要があります
-
変数割り当て規則: 近接の原則
- 最初に自分のスコープ内を調べて、スコープがある場合は直接割り当てます
- そうでない場合は、上部のスコープに移動して見つけ、ある場合は直接割り当てます
- 上位のスコープに検索がない場合は、値を直接割り当てます
- グローバル スコープがない場合は、この変数をグローバル変数として定義し、値を割り当てます。
function fn() { num = 100 } fn() // fn 调用以后,要给 num 赋值 // 查看自己的作用域内部没有 num 变量 // 就会向上一级查找 // 上一级就是全局作用域,发现依旧没有 // 那么就会把 num 定义为全局的变量,并为其赋值 // 所以 fn() 以后,全局就有了一个变量叫做 num 并且值是 100 console.log(num) // 100
再帰関数
-
再帰関数とは
-
プログラミングの世界では、再帰は自分自身を呼び出す手段です
-
再帰関数: 関数自体を直接または関数内で間接的に呼び出す
-
再帰には出口が必要であり、出口がない場合はデッド再帰が形成されます (最大呼び出しスタック サイズを超えました: スタック オーバーフロー\メモリ オーバーフロー)
// 下面这个代码就是一个最简单的递归函数 // 在函数内部调用了自己,函数一执行,就调用自己一次,在调用再执行,循环往复,没有止尽 function fn() { fn() } fn()
-
実際、再帰関数はループに非常に似ています
-
初期化、自己インクリメント、コード実行、および条件判断が必要です。それ以外の場合は、デッド
再帰の単純な実装
-
最初に再帰関数を使用して単純に効果を達成しましょう
-
要件: 1 から 5 までの和を求めてください
- 最初に 1 + 2 を数えて 3 を取得します
- 3 + 3 を足すと 6 になります
- 次に、6 + 4 を数えて 10 を求めます。
- 次に、10 + 5 を数えて 15 を取得します。
- 終了
-
書き込みを開始し、最初に再帰関数を記述して終了条件を記述します (「dead recursion」を回避するため)
function add(n) { // 传递进来的是 1 // 当 n === 5 的时候要结束 if (n === 5) { return 5 } } add(1)
-
次に、条件が満たされない場合の再帰処理を記述します
function add(n) { // 传递进来的是 1 // 当 n === 5 的时候要结束 if (n === 5) { return 5 } else { // 不满足条件的时候,就是当前数字 + 比自己大 1 的数字 return n + add(n + 1) } } add(1)
関数とイベントの組み合わせ
イベント:
onclick: クリックイベント
onmouseover: マウスオーバー イベント
onmouseout: マウスアウト イベント
簡単な例: (ちょっとした電卓の実装例)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
main {
width: 1000px;
margin: 100px auto;
text-align: center;
line-height: 200px;
}
input,select,button{
display: inline-block;
border: none;
width: 50px;
height: 50px;
background-color: rgba(127, 255, 212, 0.548);
text-align: center;
line-height: 50px;
}
</style>
</head>
<body>
<main>
<input type="text" id="text1">
<select id="select">
<option>+</option>
<option>-</option>
<option>*</option>
<option>/</option>
<option>%</option>
</select>
<input type="text" id="text2">
<button id="btn">=</button>
<input type="text" id="text3">
</main>
</body>
</html>
<script>
var oText1 = document.getElementById("text1")
var oText2 = document.getElementById("text2")
var oText3 = document.getElementById("text3")
var oselect = document.getElementById("select")
var oBtn = document.getElementById("btn")
oBtn.onclick = function () {
switch (oselect.value) {
case "+":
oText3.value = Number(oText1.value) + Number(oText2.value);
break;
case "-":
oText3.value = Number(oText1.value) - Number(oText2.value);
break;
case "*":
oText3.value = Number(oText1.value) * Number(oText2.value);
break;
case "/":
oText3.value = Number(oText1.value) / Number(oText2.value);
break;
case "%":
oText3.value = Number(oText1.value) % Number(oText2.value);
break;
default:
break;
}
}
</script>
わかりやすいオブジェクト
オブジェクト: すべてがオブジェクトであり、オブジェクトは一連の属性と動作の組み合わせです
-
オブジェクトは複雑なデータ型です
-
実際には複雑ですが、それほど複雑ではなく、いくつかの基本的なデータ型を格納するコレクションにすぎません。
var obj = { num: 100, str: 'hello world', boo: true }
-
ここ
{}
は関数と{}
同じではありません -
コードは関数に記述され、一部のデータはオブジェクトに記述されます
-
オブジェクトはキーと値のペアのコレクションです
-
{}
その中の各キーはメンバーです -
言い換えれば、オブジェクトにいくつかのデータを入れることができ、それらは互いに干渉しません
-
実際には、家を用意し、その中に必要なデータを入れ、その家の住所を変数名に与えます. 特定のデータが必要な場合、変数に格納された住所に従って、対応する家を見つけることができます.名前、次に家に行き、対応するデータを見つけます
-
showメソッドは情報を表示するために使用でき、呼び出された後にのみ表示できます(オブジェクト内のメソッド)。
<script> var obj={ //name:"张三",----》键值对, 键值对与键值对之间用,隔开,最后一个不用, name:"张三", age:14, eat(){ console.log("火锅") },//show方法是可以用来展示信息的,调用后才能展示出来(对象内的方法)调用时需要对象.方法去调用 show(){ console.log("name"+obj["name"]+"age"+obj["age"]) } } console.log(obj);//打印对象 obj.show();//对象调用方法 .语法 obj["show"];//对象调用方法 []语法 //对象访问语法 .语法/[]语法 var obj = { } // . 语法 obj.name = "张三"; obj.age = 16; // [ ]语法 obj["name"] = "张三"; obj["age"] = 16; //增:obj.name = "张三" // 删:delete obj.name //改: obj.name = "李四"; </script>
オブジェクトを作成する
-
オブジェクトを文字通り作成する
// 创建一个空对象 var obj = {} // 像对象中添加成员 obj.name = 'Jack' obj.age = 18
-
組み込みコンストラクターを使用してオブジェクトを作成する
-
オブジェクトは、オブジェクトを作成するために使用される js に組み込まれたコンストラクター関数です。
// 创建一个空对象 var obj = new Object() // 向对象中添加成员 obj.name = 'Rose' obj.age = 20