- 证明函数是对象
function foo() {}
foo instanceof Object // true
- 每个函数都是一个 Function 对象
function foo() {}
foo instanceof Function // true
- 任何对象都是函数创建的
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;
};
函数与对象的关系
-
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 操作符会沿着原型链向上查找,所以结果为 true -
console.log(Object instanceof Function):输出 true,原因:Object 是一个函数,函数都是由 Function 创建,所以
Object.__proto__ == Function.prototype
闭包
当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使函数是在当前词法作用域之外执行。
function foo() {
var a = 2;
function bar() {
console.log(a);
}
return bar;
}
bar() 依然持有对 foo 作用域的引用(因此 foo 作用域在函数执行完之后不会被垃圾回收),而这个引用就叫闭包
只要使用了回调函数,实际上就是在使用闭包