Javascript 变量和函数提升

标签 javascript hoisting

david sharif做了一个 JS 测验,看起来很像 -

var foo=1;    

function bar(){
  return foo;
  foo=10;
  function foo(){}
  var foo =5;
}

typeof bar();//?

根据我的理解,首先托管函数,然后在内部声明变量。该函数的托管形式类似于(如果我错了,请纠正我)-

var foo=1; 

function bar(){
  function foo(){}
  var foo;

  return foo;
  foo=10;
  foo =5;
}
typeof bar();//?

为什么 typeof bar() 函数不是未定义的?

这是因为,在函数执行时,它找到了第一个foo(它是一个函数)并愉快地返回,而没有继续搜索。还是别的什么?

感谢您的时间。

最佳答案

我在 David Shariff 中找到了答案博客。

“无耻地从他的博客复制”-

尽管 foo 被声明了两次,但我们从创建阶段就知道函数是在变量之前在激活对象上创建的,如果属性名称已经存在于激活对象上,我们只需绕过声明即可。

因此,首先在激活对象上创建对函数 foo() 的引用,当我们让解释器访问 var foo 时,我们已经看到属性名称 foo 存在,因此代码不执行任何操作并继续执行。

如果这听起来像希腊语,请阅读全文 blog

关于Javascript 变量和函数提升,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20308222/

相关文章:

javascript - 如何默认跳过 Grunt 目标

javascript - 来自带有 Chart.js 的 JSON 文件的多行/数据系列

Javascript 函数作用域和提升

javascript - 变量绑定(bind)/第一类函数是否比私有(private)方法命名更可取?吊装如何受到影响?

javascript - 当窗口大小调整时,按钮应该以不同的方式工作

javascript - 从浏览器上传视频到 youtube

javascript - 使用 JavaScript 替换 txt 文件中的一行

javascript - 为什么 jQuery 对象的属性初始化为空?

javascript - 提升与范围链

javascript - JS : Why does function declaration order matter when inside a conditional block?