技术解析

请教一个预编译的问题
0
2021-08-30 21:50:05
idczone

网上说预编译的最后一步几乎都是:找到函数声明,将函数名当作 AO 对象的属性,对应属性的值为函数体。

按照这样的理解,下面的调用 bar 肯定是成功的。

function foo() {
  bar() 
  function bar() {}
}

foo()

稍微修改一下。

function foo() {
  bar() //bar is not a function
  {
    function bar() {}
  }
}

foo()

如上所示,bar 的值不是一个 function,而是 undefined。

为什么 bar 是 undefined ?


是不是作用域的问题?

这跟预编译有什么关系么 ...

那请教一下是什么问题呢?

你这是作用域的问题。。和预编译有啥关系

如果是作用域的问题,那么下面这段代码也一定是错的
function foo() {
{
function bar() {}
}
bar()
}
foo()
但是它却是运行成功的

脚本语言哪来编译一说

对于已经实现 ES6 的浏览器,在块级作用域中的函数声明是有些混乱的,具体可以看教程
https://es6.ruanyifeng.com//>函数声明类似于 var,即会提升到全局作用域或函数作用域的头部。
同时,函数声明还会提升到所在的块级作用域的头部。
按照我的理解,题目中的代码,实际是按照这样解析
function foo() {
var bar
bar()
{
bar = function () {}
}
}
foo()
原则上,为了避免歧义,应该彻底弃用函数声明,一律用函数表达式

感谢

var bar= () =>

function 定义和 var 都会带来变量提升,此题终结

ES6 添加了块级作用域,所以你用{}包起来就有了一个私有的作用域.
如果你在 ES5 环境中(IE8 以下)应该不会报错

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服