functionfun(n, o) { console.log(o) return { fun: function(m){ returnfun(m, n); } }; } var a = fun(0); a.fun(1); a.fun(2); a.fun(3);//undefined 0 0 0 var b = fun(0).fun(1).fun(2).fun(3);//undefined 0 1 2 var c = fun(0).fun(1); c.fun(2); c.fun(3);//undefined 0 1 1
涉及闭包和作用域 fun 返回一个对象 a 不断调用 a 上的 fun 方法,该方法为 fun 函数,有点递归的意思,但由于每次都只传入第一次运行时闭包的 n(0),所以每次输出 0 b 每次返回一个新对象来链式调用,新对象的 n 默认为上一个对象调用方法时传入的参数 m c 调用两次函数,返回两次对象,后两次为调用方法,所以对象上形参 n 一直是 1
1 2 3 4 5 6 7 8 9 10 11
f = function() {returntrue;}; g = function() {returnfalse;}; (function() { if (g() && [] == ![]) { f = functionf() {returnfalse;}; // function g() {return true;} } functiong() {returntrue;} })(); console.log(f()); // false
考察预编译 一次执行函数中的 g () 会预编译,所以此时 if 为真,执行语句,此时 f 被重新赋值,所以输出 false 注意如果 g 函数写在 if 中,g 还是会预编译,在一次执行函数的作用域执行 var g,但值为 undefined,不会运行预编译第二步将函数声明提升,此时在 if 判断时执行 g () 时会报错 g is not a function