預解析指的就是,在js文件或者script裡面的代碼在正式開始執行之前,進行的一些解析工作。這個工作很簡單,就是在全局中尋找var關鍵字聲明的變數和通過function關鍵字聲明的函數。 1.尋找 var function 參數 等關鍵字,根據var a提前設置為 a=未定義(undefined) ...
預解析指的就是,在js文件或者script裡面的代碼在正式開始執行之前,進行的一些解析工作。這個工作很簡單,就是在全局中尋找var關鍵字聲明的變數和通過function關鍵字聲明的函數。
1.尋找 var function 參數 等關鍵字,根據var a提前設置為 a=未定義(undefined) ,所有的變數,在正式運行前都提前賦值了一個未定義。
2.函數在正式運行代碼前,都是整個函數塊。fn1=function fn1(){alert(2);}
執行js代碼一般分兩步:1.預解析代碼。 2.逐行執行代碼。
var a = 1;
var b;//
c = 3;//
function d(){//用聲明的方式聲明的函數
console.log('hello');
}
var e = function(){//函數表達式
console.log('world');
}
強調:1、預處理的函數必須是JS中用聲明的方式聲明的函數(不是函數表達式)
當變數和函數重名時:就只留下函數的值,不管順序誰前誰後。所以函數的優先順序比變數高。註意:這隻是預解析。
當函數和函數重名時:會留下後面那個,會遵循上下文機制。
- 預解析後會正常的讀取代碼(由上至下)
下麵舉例說明一下預解析:
var fn=456;
function fn(){
console.log('123')
}
在上述的代碼中我們預解析後會變成:
var fn; //fn的值未定義
//fn的值是函數本身 也就是functionfn(){console.log('123')}
function fn(){
console.log('123')
}
fn=456; //代碼逐行執行 fn被賦了一個新的值456
作用域在JS中同樣也是一個重要的概念。它不複雜,因為ES5中只有全局作用域和函數作用域,我們都知道他沒有塊級作用域。但在ES6中多了一個let,他可以保證外層塊不受內層塊的影響。即內層塊形成了一個塊級作用域,這是let的一個特點。它不簡單,因為在許多的函數嵌套的情景下,只有對它理解深刻,才能更好的去分析。今天我們著重講的是函數作用域與全局作用域。
var a=1;
function f1(){
var b=2;
}
}
作用域是在一個函數創建時就已經形成的,而不是調用時
var a=1;
function fn1(){
console.log(a)
};
fn1()
第二種
function fn1(){
var a=1;
};
fn1();
console.log(a);
第三種
var a=1;
function fn1(){
console.log(a)
a = 2;
};
fn1();
console.log(a);
第四種
var a=1;
function fn1(){
console.log(a)
var a = 2;
};
fn1();
console.log(a);
1.全局變數和它的作用域
全局變數是指在程式開頭的說明部分定義和說明的量。它的作用域分為兩種情況:
(1)在全局變數和局部變數不同名時,其作用域是整個程式。
(2)在全局變數和局部變數同名時,全局變數的作用域不包含同名局部變數的作用域。
面試題一
var a = 10;
function f1(){
var b = 2 * a;
var a = 20;
var c = a+1;
console.log(b);
console.log(c);
}
f1()