简单理解函数是特殊的对象

111 阅读1分钟
function foo(){
    var test = 1
}
foo.myName = 1
foo.uName = 2
console.log(foo.myName)

image.png

在v8内部, 会为函数 添加隐藏的name, 和code 属性:

  • name 属性的值就是函数名称, 匿名函数则是 anonymous
  • code 属性值表示函数代码,以字符串的形式存储在内存中

当执行函数的时候, v8就去查询code属性值, 然后解释执行这段代码.

闭包

javascript里的函数, 可以像变量一样, 使用起来没有其他限制, 有很高的灵活性.

所以在函数调用的时候, 需要去处理函数引用的外部变量

v8因此维护了一个作用域链,

在函数中使用的变量, 会沿着作用域链去查找, 没有找到则报错.

function foo(){
    var number = 1
    function bar(){
        number++
        console.log(number)
    }
    return bar
}
var mybar = foo()
mybar()

image.png

这样因为外部变量被函数引用, 所以外部变量不能被销毁, 会被保存到内存堆中.

这样就形成了闭包.