Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/391.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_Function - Fatal编程技术网

在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。