var outerValue = '1111' var later function outerFunc(){ var innerValue = '222' function innerFunc (){ console.log(outerValue) console.log(innerValue) } later = innerFunc } console.log(innerValue) outerFunc() later() //无论是作为返回值或者参数,还是直接在函数内部进行赋值,最根本的点在于有 //一个变量保持了对函数里面某个变量的引用,只要这个引用存在,对应的作用域 //就不会被销毁 //形式上,有访问到内部私有变量的效果 //为什么内部函数在作用域消失之后再执行内部函数,其变量依然存在? //因为在预编译的过程中,在外部函数声明内部函数时,不仅定义了函数,还创建了一个闭包 //闭包中登记了函数的声明,还登记了函数声明时的变量 //在函数执行的时候,通过执行上下文可以找到对应的变量