
网上说预编译的最后一步几乎都是:找到函数声明,将函数名当作 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() 1 littlewing 2019 年 5 月 22 日 via iPhone 是不是作用域的问题? |
2 secondwtq 2019 年 5 月 22 日 这跟预编译有什么关系么 ... |
4 bestie 2019 年 5 月 22 日 你这是作用域的问题。。和预编译有啥关系 |
5 kuanng OP |
6 VDimos 2019 年 5 月 22 日 via Android 脚本语言哪来编译一说 |
7 autoxbc 2019 年 5 月 22 日 对于已经实现 ES6 的浏览器,在块级作用域中的函数声明是有些混乱的,具体可以看教程 https://es6.ruanyifeng.com/#docs/let#%E5%9D%97%E7%BA%A7%E4%BD%9C%E7%94%A8%E5%9F%9F%E4%B8%8E%E5%87%BD%E6%95%B0%E5%A3%B0%E6%98%8E 关键的部分摘录如下 允许在块级作用域内声明函数。 函数声明类似于 var,即会提升到全局作用域或函数作用域的头部。 同时,函数声明还会提升到所在的块级作用域的头部。 按照我的理解,题目中的代码,实际是按照这样解析 function foo() { var bar bar() { bar = function () {} } } foo() 原则上,为了避免歧义,应该彻底弃用函数声明,一律用函数表达式 |
9 aaniao002 2019 年 5 月 23 日 via Android var bar= () => |
10 KuroNekoFan 2019 年 5 月 23 日 via iPhone function 定义和 var 都会带来变量提升,此题终结 |
11 redbuck 2019 年 5 月 23 日 ES6 添加了块级作用域,所以你用{}包起来就有了一个私有的作用域. 如果你在 ES5 环境中(IE8 以下)应该不会报错 |