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/