我理解尾递归,是一个特殊情况,函数对它自己进行尾调用.但我不明白尾调用和尾递归是如何不同的.在具有已实现的TCO(尾调用优化)的"正确尾递归"语言中,如Scheme,这意味着尾调用和尾递归不消耗堆栈或其他资源.在编译器无法优化尾递归的语言中,程序可能会耗尽堆栈并崩溃.在"正确的尾递归"语言中,实现尾递归以进行循环的效率并不比使用循环高,我猜想.
很明显,在EcmaScript中,调用时的函数会创建一个新的执行上下文.函数中定义的所有变量和函数只能在该函数范围内访问.但是当我们使用闭包变量时,可以在该上下文之外访问函数.IIFE是一个立即调用的函数表达式.很简单.
但是为什么IIFE与自我执行的匿名函数不同,对我来说还不完全清楚!?
我不确定我是否理解正确,为什么在旧版本的Lisp中没有实现静态作用域,只有动态作用域.已经发明了Scheme的Sussman和Guy L. Steele Jr.只实现了静态范围.
我发现有时静态变量使用起来更方便,因为它们可以用作完美的状态持有者,尽管我们应该小心避免不希望的名称冲突,因为这是不希望的副作用.
我知道在编译期间检测到静态作用域,而动态作用域仅在运行时检测到.并且动态范围被认为是难以dubug,有时是为了推理.
如果我们把上面提到的事实放在一边,我不确定我理解为什么静态范围通常被认为比动态范围更好?
旧的HTML <p>
标签是简单的分隔符,就像<hr> or <br>
.它变成了容器<p></p>
.这对我来说没有意义.它们可以<div></div>
用作容器,并保持<p>
原样.为什么W3C会这样做?