Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/433.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript变量和函数_Javascript_Hoisting - Fatal编程技术网

Javascript变量和函数

Javascript变量和函数,javascript,hoisting,Javascript,Hoisting,做了一个JS测试,看起来很像- var foo=1; function bar(){ return foo; foo=10; function foo(){} var foo =5; } typeof bar();//? 在我的理解中,函数首先是hosite,然后在内部声明变量。函数的hosite形式类似于(如果我错了,请纠正我)- 为什么typeof bar()函数不是未定义的 这是因为,在函数执行时,它会找到第一个foo(这是一个函数),并在不继续搜索的情况下愉

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

var foo=1;    

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

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

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

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

感谢您的时间。

我在博客中找到了答案

“无耻地抄袭他的博客”——

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

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

如果这听起来像希腊语,请阅读整个函数声明“阴影”var语句。 将其粘贴到您的控制台:

var foo = function(){}
var foo
typeof foo
以下是编译时间后解释器对代码的“外观”:

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返回。
功能条(){
返回foo;
函数foo(){}//这将在返回语句之前初始化。
}

console.log(typeof bar());//这将是函数
var foo=11;//你完全正确,谢谢你的纠正,我已经更新了我的答案。
var bar = function bar(){
  var foo = function foo(){}
  foo
  return foo;
  // never reached
  foo = 10;
  foo = 5;
}
var foo;
foo = 1    
typeof bar();//"function"