- 函式宣告
var f = function g() {
return 23;
};
typeof g(); // error g is not defined複製程式碼
在javaScript裡,宣告函式只有2種方法
第一種:函式宣告
function foo(){...}
複製程式碼
第二種:函式表示式
var foo = function(){...}
複製程式碼
其他如var f = function bar() {....}等宣告都按第二種方法處理,函式外部無法通過bar訪問到函式,因為是一個表示式
- 變數回收
以下程式碼存在幾個變數沒有被回收?
var i = 1;
var i = 2;
var add = function() {
var i = 0;
return function(){
i++;
console.log(i);
}}();
add();複製程式碼
變數回收規則有三點
1.全域性變數不會被回收
2.區域性變數會被回收,函式執行完後內部的東西都會被銷燬
3.如果變數被另外一個作用域引用就不會被回收
由此可以得知有三個變數沒有被回收,分別是全域性變數i、add 還有閉包中的i
- 型別轉換
var x = new Boolean(false);
if (x) {
alert('hi');
}
var y = Boolean(0);
if (y) {
alert('hello');
}複製程式碼
輸出: hi複製程式碼
new Boolean 與 Boolean的區別在於:用new呼叫建構函式會新建一個布林物件,所以此處的x為物件,任何物件轉布林值都為true!
而Boolean,此處沒有new, 進行的是顯式轉換,0轉布林值為false
- javaScript標準事件模型
順序:事件捕獲 -> 事件處理 -> 事件冒泡
描述:先事件捕獲從windows > document 往下級直到特定事件節點,然後進行事件處理,再事件冒泡,從節點往上級冒泡
- 閉包
var A = {n:4399}
var B = function () {
this.n = 9999
}var C = function () {
this.n = 9999
}
B.prototype = A
C.prototype = A
var b = new B()
var c = new C()
A.n++;
console.log(b.n) // 9999
console.log(c.n) // 4400複製程式碼
此題考查的是:在查詢 b.n 是首先查詢 b 物件自身有沒有 n 屬性,如果沒有會去原型(prototype)上查詢
當執行 var b = new B() 時,函式內部 this.n=9999(此時this指向b) 返回b物件,b物件有自身的n屬性,所以返回 9999
console.log(c.n);
同理
當執行 var c = new C() 時,c物件沒有自身的n屬性,向上查詢,找到原型 (prototype)上的 n 屬性,因為 A.n++(此時物件A中的n為4400), 所以返回4400