- 證明函數(shù)是對象
function foo() {}
foo instanceof Object // true
- 每個(gè)函數(shù)都是一個(gè) Function 對象
function foo() {}
foo instanceof Function // true
- 任何對象都是函數(shù)創(chuàng)建的
var s = ''; // var s = new String('');
var n = 0; // var s = new Number(0);
var arr = []; // var arr = new Array([]);
var obj = {}; // var obj = new Object({});
function sum(a, b) { // const sum = new Function('a', 'b', 'return a + b');
return a + b;
};
函數(shù)與對象的關(guān)系
-
console.log(Function instanceof Function):輸出 true溃卡,原因:
Function.__proto__ == Function.prototype
-
console.log(Function instanceof Object ):輸出 true检吆,原因:
Function.__proto__ == Function.prototype
,而Function.prototype.__proto__ == Object.prototype
铭拧;instance 操作符會沿著原型鏈向上查找,所以結(jié)果為 true -
console.log(Object instanceof Function):輸出 true,原因:Object 是一個(gè)函數(shù),函數(shù)都是由 Function 創(chuàng)建黔攒,所以
Object.__proto__ == Function.prototype
閉包
當(dāng)函數(shù)可以記住并訪問所在的詞法作用域時(shí),就產(chǎn)生了閉包强缘,即使函數(shù)是在當(dāng)前詞法作用域之外執(zhí)行亏钩。
function foo() {
var a = 2;
function bar() {
console.log(a);
}
return bar;
}
bar() 依然持有對 foo 作用域的引用(因此 foo 作用域在函數(shù)執(zhí)行完之后不會被垃圾回收),而這個(gè)引用就叫閉包
只要使用了回調(diào)函數(shù)欺旧,實(shí)際上就是在使用閉包