JavaScript 有一段 JS 代码不是太明白!

xdir · 2014年08月11日 · 最后由 suffering 回复于 2014年08月11日 · 2670 次阅读
function outerFn() {
    console.log('Outer function');
    function innerFn() {
        console.log('Inner function');
    }
    return innerFn;
}

var fnRef = outerFn(); #=>Outer function

fnRef(); #=>Inner function 为什么 fnRef 会是 inner function 而不是 outer function

注意 var fnRef = outerFn(); 也就是说 fnRef 是 outerFu 这个函数的返回值,那么这个函数的返回值是什么呢? 看 return 语句,就知道是 innerFu 啊。 所以 fnRef 其实是指向 innerFn 的。 那么 fnRef() 就是调用 innerFn 了,结果就很自然了。

@heliang7 哇~原来如此,谢谢

这是个 Higher-order function 的典型例子。

  1. var fnRef = outerFn(); #=>Outer function outerFn() 执行,于是先执行 console.log('Outer function');稍后返回 innerFn 并赋值于 fnRef 中。

  2. fnRef(); #=>Inner function 由于前面的函数返回并赋值,fnRef 中保存的实际上是 innerFn 函数的引用。因此调用 fnRef() 等同于 innerFn()。

可参考:http://eloquentjavascript.net/05_higher_order.html

这个技巧就是把

func(a, b, c, d) 转化为 func(a)(b)(c)(d) 的技巧。

变量 fnRef 已经是个函数了==innerFn 啊,那你调用 fnRef() == innerFn() 哦

Function is the first-class object. 意思是说,函数可以作为函数的参数传入,可以作为函数的值返回,也可以赋值给变量。如此等等,这些是 functional programming 的一大特性。如果说 ruby 里的元编程机制让 ruby 动态而且灵活,那 javascript 等函数式编程就是靠着以上特性而灵活,强大。理解 JS, 无非是函数/闭包/prototype. 这几点核心理解掌握了,JS 在手中就是利器了。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号