Javascript变量和函数提升

Javascript variable and function hoisting

本文关键字:函数 变量 Javascript      更新时间:2024-01-25

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

var foo=1;    
function bar(){
  return foo;
  foo=10;
  function foo(){}
  var foo =5;
}
typeof bar();//?

在我的理解中,函数首先是hosite,然后是内部声明的变量。函数的hosited形式类似于(如果我错了,请纠正我)-

var foo=1; 
function bar(){
  function foo(){}
  var foo;
  return foo;
  foo=10;
  foo =5;
}
typeof bar();//?

为什么type of bar()是未定义的函数?

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

感谢您抽出时间。

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

"无耻地抄袭他的博客"-

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

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

如果这听起来像希腊语,请阅读整个博客

函数声明"隐藏"var语句

将此粘贴到您的控制台:

var foo = function(){}
var foo
typeof foo

这就是compiletime:之后代码对解释器的"外观"

var bar = function bar(){
  var foo = function foo(){}
  foo
  return foo;
  // never reached
  foo = 10;
  foo = 5;
}
var foo;
foo = 1    
typeof bar();//"function"

函数声明在进入封闭范围时进行评估,然后再执行任何分步代码。函数的名称(foo)被添加到封闭范围(从技术上讲,是在其中定义函数的执行上下文的变量对象)。

示例1

从这个例子中,我们可以看到,即使我们在return语句之后声明foo,我们仍然可以返回foo。

function bar() {
  return foo;
  function foo() {} // this will get initialized before the return statement.
}
console.log(typeof bar()); // this will be function

示例2

从这个例子中,我们可以看到,如果我们在return语句之后以正常方式声明变量,它们将不会执行(赋值)。

返回后声明函数。

function bar() {
  return foo;
  var foo = function() {} // this will not get assigned
}
console.log(typeof bar()); // this will be undefined

返回后申报编号

function bar() {
  return foo;
  var foo = 12; // this will not get assigned
}
console.log(typeof bar()); // this will be undefined

示例3

现在,让我们一行一行地浏览一个更混乱的示例。

function bar() {
  return foo;
  function foo() {}  // <-- initialize foo as a function
  var foo = 11;      // <-- this will not get assigned
}
console.log(typeof bar());  // function

我希望上面的例子不仅能回答你的问题,还能让你更好地理解:

var foo = function() {}function foo() {}