js函数声明的疑问

edisonchan
  • 18

为什么第一个fn()执行结果是2 而不是undefined?

(function(){
    fn();
    var fn=function(){
        alert(1);
    };
    fn();
    function fn(){
        alert(2);
    };
})()
回复
阅读 1.7k
4 个回答
ZWkang
  • 594

函数声明有提升
首先解析的时候。
顺序大概是
var变量声明
函数声明提升
赋值表达式
所以以上是
var fn;
function fn(){alert(2)}
fn()
fn = function(){alert(1)}
fn()


纠错!
这是定义绑定初始化的顺序
clipboard.png
clipboard.png
clipboard.png
clipboard.png
对应的中文翻译

clipboard.png
clipboard.png
clipboard.png
clipboard.png

可以看到指出了var声明的顺序是在最后的
特此纠错


参考资料:
https://www.ecma-internationa...
http://yanhaijing.com/es5/

第一位的回答有问题,在预编译阶段,函数声明提升优先于变量声明提升的。

// 预编译阶段
function fn(){
    alert(2);
};
var fn;

// 执行阶段
fn();    // 此时结果为 2
fn = function() {
    alert(1);
}
fn();    // 此时结果为 1
Huooo
  • 328

同意楼上,function申明优先于var声明。之前总结过一些,可以看一下js部分DEMO

首先,我们要知道js语句的执行过程:
(一)预编译阶段
1.按照正常的从上至下的顺序声明变量或者函数
2.函数声明提升
(二)正常的顺序执行函数调用或者变量赋值
3.调用函数/执行赋值语句

对于楼主这个问题,可以具体为以下过程:
第一步:

var fn;
function fn () {
    alert(2);
}

第二步:(函数声明提升)

function fn () {
    alert(2);
}
var fn;

第三步: 正常的顺序执行(此时函数声明已经被提到最顶端)

fn();
fn = function () {
    alert(1);
}
fn()

于是执行结果就是2, 1
希望对你有帮助

宣传栏