事前分析
- まず、jsコードの実行メカニズムを理解します
- Pre:pre、すべてのコードが実行される前
- 分析:コードを説明し、読み通し、説明する
- jsは最初に事前解析し、次にコードを実行します
何が解析されましたか?
1.Varキーワード
- 事前解析は、コードが実行される前にvarキーワードで定義された変数を宣言しますが、現時点では値を割り当てません
console.log(num);
var num = 100;
console.log(num);
var num;
console.log(num);
num = 100;
console.log(num);
2.宣言関数
- メモリ内で、最初に変数名が関数名であり、この名前で表されるコンテンツが関数であることを宣言します
fn();
function fn(){
console.log("我是fn函数");
}
function fn(){
console.log("我是fn函数");
}
fn();
注意:
- 代入機能:
var fn = function(){}
- varのルールに従って解析します
fn();
var fn = function fn(){
console.log("我是fn函数");
}
var fn;
fn()
fn = function fn(){
console.log("我是fn函数");
}
fn();
事前に解決されたケース
- 関数と変数の名前が同じである場合、その関数は分析前の段階で優先されます。
- 最初の質問:
fn();
var fn = 100;
fn();
function fn(){
console.log("我是 fn 函数");
}
fn();
预解析阶段
1. var fn
2. function fn(){
...}
3. 声明 fn 变量
4. 声明 fn 变量 并且赋值为一个函数
5. 预解析结束的时候,浏览器记录的 fn 变量是一个函数
代码开始执行
1. fn()
2. fn = 100;
3. fn()
4. fn()
fn();
function fn(){
console.log("我是 fn 函数");
}
fn();
var fn = 100;
fn();
预解析阶段
1. function fn(){
...}
2. var fn
代码开始执行
1. fn()
2. fn()
3. fn = 100;
4. fn()
分析前の隠れた危険
- if条件が確立されているかどうかに関係なく、内部のコードは事前に解析されます
console.log(num);
if(false){
var num = 100;
}
console.log(num);
console.log(num);
if(false){
var num = 100;
}
console.log(num);
console.log(num);
if(false){
var num;
num = 100;
}
console.log(num);
- returnの背後にあるコードは実行されませんが、事前に解析されます
function fn(){
var num = 100;
console.log(num);
console.log(n);
return;
var n = 200;
}
fn();
function fn(){
var num;
var n;
num = 100;
console.log(num);
console.log(n);
return;
n = 200;
}
fn();
分析前の提案
1. 函数名 不要与 变量同名
2. 变量名以名词为主,2个或3个单词组合使用
如:username,userInfoAge
3. 函数名以功能区分,尽量语义化
如:getColor(),setColor()
4. 尽量使用 赋值式函数 来定义