Javascript变量和函数
做了一个JS测试,看起来很像-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(这是一个函数),并在不继续搜索的情况下愉
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"