Javascript变量和函数提升
Javascript variable and function hoisting
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() {}
- 访问嵌套函数结构中的JavaScript父函数变量
- Javascript函数变量传递语法问题
- JavaScript 函数变量范围问题
- 在 promise 中获取构造函数变量
- 将函数结果传递给Javascript中的另一个函数变量
- 用对象设置函数变量's值
- Javascript函数变量应生成错误,而不是未定义的错误
- 我可以访问用户脚本中的匿名函数变量吗?
- 在实例化期间使用构造函数变量
- 为什么在 JavaScript 中不能用函数变量覆盖字符串变量
- JavaScript 允许调用函数访问调用函数变量
- 如何在嵌套原型中访问 JavaScript 构造函数变量
- 对函数变量的 JavaScript 控制台日志输出感到困惑
- 如何将函数变量传递给主干模型上的 jQuery 事件
- 如何访问构造函数变量
- 实例函数变量不会更改
- 为什么函数变量在变量之后是未定义的
- 用内部函数变量更改外部函数变量?Javascript
- Javascript - 使用闭包递增静态函数变量模拟
- 异步 JavaScript 静态函数变量