0x00 函數
·函數的實參數可以大於形參數,按照實參的順序賦值給形參,多餘的忽略;
·若函數的實參數小於形參數,則未賦值的形參值爲undefined;
·函數如果沒有return則返回undefined;
·arguments是函數的一個內置對象,其中儲存了傳遞的所有實參;
·arguments是僞數組,它可以按照索引並獲取值並且有length這個屬性,但是它沒有數組的一些方法,如pop();
0x01 作用域
es5的作用域爲函數作用域和全局作用域,但是有個問題,就是函數作用域會覆蓋全局作用域,例子如下
<script>
var a = 1;
var fn = () => {
console.log(a);
if(-1){
var a = 3;
}
}
fn();
</script>
執行fn()輸出的並不是1,而是undefined,這是因爲在函數中函數作用域覆蓋了全局作用域。
還有一個缺點就是循環中的變量泄露爲全局變量
針對以上情況,es6標準定義了塊級作用域,使用let定義,外層作用域無法訪問到內層作用域,這樣上面所述的情況變得到了解決
<script>
let a = 1;
let fn = () => {
console.log(a);
if(-1){
let a = 3;
}
}
fn();
</script>
0x02 函數作用域
·在函數內部直接賦值沒有聲明得變量也是全局變量
·在es5中內部函數訪問外部函數採取的是鏈式查找的方式決定取哪個值
<script>
var num = 10;
var fn = () => { // 外部函數
var num = 20;
var fn1 = () => { // 內部函數
console.log(num);
}
}
fn();
</script>
在本案例中輸出的num爲20,也就是按照鏈式查找的方法來取num的值
0x03 預解析
·Js引擎執行代碼分爲兩步,第一步是預解析,第二步纔是執行代碼
·Js預解析會將當前作用域的var function提到作用域的最前面
·Js預解析分爲兩個部分,變量提升(預解析)和函數(預解析)
·變量解析和函數解析都是將聲明提前到當前作用域的最前面,注意只是提升聲明
經典面試題
<script>
fn1();
console.log(c);
console.log(b);
console.log(a);
function fn1() {
var a = b = c = 9;
console.log(a);
console.log(b);
console.log(c);
}
</script>
注意,這裏的var a = b = c = 9;相當於var a = 9;b = 9; c = 9;所以b,c爲全局變量,這裏只定義了一個var。
0x04 構造函數
·構造函數的首字母要大寫
·構造函數不需要return即可返回結果
·調用構造函數必須使用new
·利用構造函數創建對象的過程叫做對象的實例化
經典面試題-new一個對象做了哪幾件事
①在內存中創建一個新的空對象;
②this指向空對象
③執行構造函數中的代碼,爲這個對象附上屬性和方法;
④返回這個對象
0x05 對象遍歷
對象遍歷可以使用for..in
<script>
let obj1 = {
name : 'a',
sex : '男',
Hi : () =>{
console.log('hi~my name is a');
}
}
for (let k in obj1){
console.log(k);
console.log(obj1[k]);
}
</script>