在javascript中运行通过两种方式创建的函数
在javascript中运行通过两种方式创建的函数,javascript,function,Javascript,Function,var a=function(){ 警报(“2”); } 函数a(){ 警报(“1”); } a()当您在JavaScript中声明函数或变量时,它会被“提升”,这意味着JavaScript解释器会假装变量(a在您的情况下)是在文件范围的顶部声明的 当该声明采用函数a()…的形式时,函数的定义将与声明一起提升 像a=function()…这样的赋值不会被提升,因此赋值发生在function a()…片段之后并覆盖它。由于函数和变量声明被“提升”到封闭范围的顶部,所以您的代码相当于: // hoi
var a=function(){
警报(“2”);
}
函数a(){
警报(“1”);
}
a()代码>当您在JavaScript中声明函数或变量时,它会被“提升”,这意味着JavaScript解释器会假装变量(a
在您的情况下)是在文件范围的顶部声明的
当该声明采用函数a()…
的形式时,函数的定义将与声明一起提升
像a=function()…
这样的赋值不会被提升,因此赋值发生在function a()…
片段之后并覆盖它。由于函数和变量声明被“提升”到封闭范围的顶部,所以您的代码相当于:
// hoisted function declaration (but written as an
// assignment of a function expression to a variable)
var a = function a(){
alert("1");
}
a = function(){
alert("2");
}
a();
因此,被调用的是a
的后一个值,如您所观察到的,显示2
。一个词:提升
这是因为变量和函数声明被提升到块的顶部,并且为变量赋值(在alert(2)案例中是这样做的)只在这些之后生效
同样地,a
在被声明为函数警报1后,被赋予一个值作为函数警报2
查看此代码的输出:
// this logs the "second" version, even though it might look like `a` was not even declared yet.
console.log('a curently:',a.toString());
var a = function(){
console.log('first');
alert("2");
}
function a(){
console.log('second');
alert("1");
}
a(); //calling a here logs "first" and alerts 2, as you describe.
@RichieHindle对正在发生的事情的概念是正确的,这就是提升。变量声明(不是它们的赋值)和使用function关键字声明的函数都被提升到作用域的顶部;并且按照javascript运行时解析它们的顺序
实际上,浏览器会按如下方式解析和解释您的代码:
var a;
function a(){
alert("1");
}
a = function(){
alert("2");
}
a(); // alerts "2"
这里起作用的另一个效应是阴影,这意味着对a
的第二次赋值将覆盖先前声明为函数的a
赋值。同一范围内相同名称的变量可以相互重写,因为Javascript没有严格的变量类型。在编写Javascript和依赖提升时需要注意的事项
这也是为什么许多Javascript开发人员和样式指南建议在作用域顶部声明变量,而不依赖提升的副作用,因为您(或其他处理代码的人)可能最终会隐藏并重新分配以前在同一作用域中声明的变量。关键字“提升”因此,顺序为var a
,函数a(){…}
然后a=function(){…}
,对吗?var
版本也被提升,但函数被提升到顶部。“…在文件顶部”由于这些可以在其他函数中声明,因此精确地说是在作用域的顶部。@DOCASAREL仅提升var
版本的var a
,对a
的赋值保留在原来的位置。@Alnitak,谢谢。更好的文件:(稍微有点混乱)P。