Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

重学js —— 函数:尾调用 #87

Open
lizhongzhen11 opened this issue Mar 13, 2020 · 0 comments
Open

重学js —— 函数:尾调用 #87

lizhongzhen11 opened this issue Mar 13, 2020 · 0 comments
Labels
js基础 Good for newcomers 重学js 重学js系列 规范+MDN

Comments

@lizhongzhen11
Copy link
Owner

lizhongzhen11 commented Mar 13, 2020

函数:尾调用

MDN没搜到相关内容。

尾调用(Tail Call)是函数式编程的一个重要概念,本身非常简单,一句话就能说清楚,就是指某个函数的最后一步是调用另一个函数。

IsInTailPosition ( call )

  1. 断言:call解析节点
  2. 如果与 call 匹配的源码是 非严格模式代码,返回 false
  3. 如果 call 不包含在 FunctionBodyConciseBodyAsyncConciseBody 中,返回 false
  4. 定义 body 为最接近包含 callFunctionBodyConciseBodyAsyncConciseBody
  5. 如果 bodyGeneratorBodyFunctionBody,返回 false
  6. 如果 bodyAsyncFunctionBodyFunctionBody,返回 false
  7. 如果 bodyAsyncGeneratorBodyFunctionBody,返回 false
  8. 如果 body AsyncConciseBody,返回 false
  9. 返回参数为 callbodyHasCallInTailPosition 结果

尾调用仅在 严格模式代码 中定义,因为通用的非标准语言 扩展 使我们能观察调用上下文链。

PrepareForTailCall ( )

  1. 定义 leafContext运行时执行上下文
  2. Suspend leafContext
  3. 执行上下文栈 中删除 leafContext。现在栈顶的 执行上下文 成为了 运行时执行上下文
  4. 断言:leafContext 将来不会被使用。它将不会作为 运行时执行上下文 激活

尾调用必须在调用目标函数之前释放与当前正在执行的函数执行上下文关联的任何临时内部资源,或者重新使用那些资源以支持目标函数。

2020-07-27 补充(立即执行函数作用域)

来自高级前端面试小程序js基础,我错了

var b = 10;
(function b(){
  b = 20;
  console.log(b);
})()

// 最终输出
function b(){
  b = 20;
  console.log(b);
}

// 和普通函数有区别
function c() {
  c = 10;
  console.log(c);
}
window.c // 函数
c() // 10
window.c // 10

如何改写使之分别打印10和20?

var b = 10;
(function b(){
  var b = 20;
  console.log(window.b);
  console.log(b);
})()

2020-07-29 补充(立即执行函数)

来自高级前端面试小程序

var name = 'jack';
(function() {
  if (typeof name === 'undefined') {
    var name = 'jack';
    console.log('Goodbye,', name);
  } else {
    console.log('Hello,', name);
  }
})()

输出 Goodbye, jack

我虽然答对了,但是我理解错了!
我误以为是全局环境下的 var 先声明,值为 undefined,然后导致输出结果。

其实我想的是错的!

var name; // undefined
(function() {
  console.log(name, typeof name) // '' string
})()

看到没有?全局声明的 name 压根没影响到立即执行函数,可见 var 变量提升优先级没有立即执行函数高。

上一段代码之所以输出 Goodbye, jack,是因为 if 判断内有个 var 声明,即立即执行函数内部有个 var 变量提升,所以才会有这种输出结果,把内部的 var 改为 let 会发现结果截然不同!

var name = 'Tom';
(function() {
  if (typeof name === 'undefined') {
    let name = 'jack';
    console.log('Goodbye,', name);
  } else {
    console.log('Hello,', name);
  }
})()

输出 Hello, Tom
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
js基础 Good for newcomers 重学js 重学js系列 规范+MDN
Projects
None yet
Development

No branches or pull requests

1 participant