闭包:函数的执行导致函数被定义
function fun(n, o){
console.log(o);
return {
fun: function(m){
return fun(m, n);
}
}
}
var a = fun(0); // undefined
a.fun(1); // 0
a.fun(2); // 0
a.fun(3); // 0
var b = fun(0) // undefined
.fun(1) // 0
.fun(2) // 1
.fun(3); // 2
var c = fun(0).fun(1); // undefined // 0
c.fun(2); // 1
c.fun(3); // 1
代码 | 过程 | 输出 |
---|---|---|
var a = fun(0); |
n = 0,o = undefined | console.log(o); // => undefined |
a.fun(1); |
function(m) -> m = 1, fun(m, n) n 相当于父作用域 (n: 0, o: undefined) 第一个参数 n , n = o = 0 function(n, o) => function(m, n) => function(1, 0); |
console.log(o); // => 0 |
a.fun(2); |
a 是 function (m) { return fun(m, n) } function(m) -> m = 2, fun(m, n) , n 相当于父作用域 (n: 0, o: undefined) 第一个参数 n, n = o = 0, function(n, o) => function(m, n) => function(2, 0); |
console.log(o); // => 0 |
a.fun(3); |
a 是 function (m) { return fun(m, n) } function(m) -> m = 3, fun(m, n) , n 相当于父作用域 (n: 0, o: undefined) 第一个参数 n, n = o = 0, function(n, o) => function(m, n) => function(3, 0); |
console.log(o); // => 0 |
var b = fun(0) |
n = 0,o = undefined | console.log(o); // => undefined |
.fun(1); |
function(m) -> m = 1, fun(m, n) , n 是上一返回的对象为父作用域 (n: 0, o: undefined) 第一个参数 n , n = o = 0, function(n, o) => function(m, n) => function(1, 0); |
console.log(o); // => 0 |
.fun(2); |
function(m) -> m = 1, fun(m, n) , n 是上一返回的对象为父作用域 (n: 2, o: 1) 第一个参数 n , n = o = 1, function(n, o) => function(m, n) => function(2, 1); |
console.log(o); // => 1 |
.fun(3); |
function(m) -> m = 1, fun(m, n) , n 是上一返回的对象为父作用域 (n: 3, o: 2) 第一个参数 n , n = o = 2, function(n, o) => function(m, n) => function(3, 2); |
console.log(o); // => 2 |
var c = fun(0).fun(1); |
n = 0,o = undefined | console.log(o); // => undefined |
function(m) -> m = 1, fun(m, n) , n 是上一返回的对象为父作用域 (n: 0, o: undefined) 第一个参数 n , n = o = 0, function(n, o) => function(m, n) => function(1, 0); |
console.log(o); // => 0 | |
c 都是 fun(1) return 的对象所以下面的父作用域都是 (n: 2, o: 1) | ||
c.fun(2); |
function(m) -> m = 1, fun(m, n) , n 是上一返回的对象为父作用域 (n: 2, o: 1) 第一个参数 n , n = o = 1, function(n, o) => function(m, n) => function(2, 1); |
console.log(o); // => 1 |
c.fun(3); |
function(m) -> m = 1, fun(m, n) , n 是上一返回的对象为父作用域 (n: 2, o: 1) 第一个参数 n , n = o = 1, function(n, o) => function(m, n) => function(3, 1); |
console.log(o); // => 1; |