如何编写高质量的 JS 函数( 五 )


  • result[0] 函数的父执行环境是 EC(kun) ,这个 VO(kun) 里面的 i 值 是 0。
  • result[9] 函数的父执行环境是 EC(kun) ,这个 VO(kun) 里面的 i 值 是 9。
记住 AO(kun) 是一段存储空间 。
第二点:关于作用域链,也就是 scopeChain ,result 中的函数的 链表形式仍然是下面这种形式:
AO(result[i]) --> AO(kun) --> VO(G)但不一样的是,对应节点的存储地址不一样,相当于是 10 个新的 AO(kun)。而每一个 AO(kun) 的节点内容中的 i 值是不一样的 。
所以总结就是:执行 result 数组中的 10 个函数时,运行10 个不同的链表,同时每个链表的 AO(kun) 节点是不一样的 。每个 AO(kun) 节点中的 i 值也是不一样的 。
所以输出的结果最后显示为 0 到 9。
六、总结通过对底层实现原理的分析,我们可以更加深刻的去理解函数的执行机制,从而写出高质量的函数 。
如何减少作用域链(链表)的查找
比如很多库,像JQ 等,都会在立即执行函数的最外面传一个 window 参数 。这样做的目的是因为,window 是全局对象,通过传参,避免了查找整个作用域链,提高了函数的执行效率 。
如何防止栈溢出?每一次执行函数,都会创建函数的执行环境,也就意味着占用一些栈内存,而栈内存大小是固定的,如果写了很大的递归函数,就会造成栈内存溢出,引发错误 。
我觉得,我们要去努力的达成这样一个成就:
做到当我在手写一个函数时,我心中非常清楚的知道我正在写的每一行代码,其在内存中是怎么表现的,或者说其在底层是如何执行的,从而达到** 眼中有码,心中无码** 的境界 。
如果能做到这样的话,那还怕写不出高质量的函数吗?

【如何编写高质量的 JS 函数】


推荐阅读