search

Home  >  Q&A  >  body text

javascript - js函数声明的区别

请问下js中声明函数:

function some() {
   //do something
}

var some = function() {
    //do something
}

有区别吗?
我目前没有发现他们的区别,有没有什么场景需要选择某一种更好呢?谢谢

阿神阿神2902 days ago340

reply all(9)I'll reply

  • PHP中文网

    PHP中文网2017-04-10 15:16:00

    a();//输出 i am a
    b();//TypeError: undefine is not a function
    
    
    function a() {
        console.log('i am a');
    }
    
    var b = function() {
        console.log('i am b')
    }
    

    按javascript解释器和语法树的思路来解释,函数a的大概这样运行

    a()//直接出现的变量名,js引擎会对它进行RHS查询,也就是向作用域询问变量a的值
    
    //首先js在编译的时候并不是从上到下,而是会对声明进行提升,优先操作
    
    function a() { //这里的function操作符实际上是声明变量a为一个函数,所以它被提升了
        console.log('i am a')
    }
    
    //输出i am a
    

    然后b

    b()
    
    var b = function() {
        console.log('i am b')
    }
    

    它的声明同样被提升了,所以这段代码等同于这样

    var b;
    
    b();
    
    b = function() {
        console.log('i am b')
    }
    
    //TypeError
    
    //注意这个抛出的TypeError!它并非是找不到变量b(找不到会抛出referrenceError),而是对b进行了一次非法操作(因为b这时候还不是一个函数)
    
    var b = function() {}
    //这句首先声明了一个b变量,引擎会进行LHS查找(向作用域询问是否存在变量a,没有就创建,有就什么都不
    //干。),之后才对变量b进行赋值操作(这里并没有提升……),而a的声明被整个提升了
    

    reply
    0
  • ringa_lee

    ringa_lee2017-04-10 15:16:00

    一个是函数声明,一个变量赋值,你可以在函数声明前调用函数,但是如果在变量赋值之前调用变量,尽管因为变量提升可以调用,但是会提示或者报错undefined~

    a();
    b();
    
    
    function a(){
        console.log('a');
    }
    
    var b = function(){
        console.log('b')
    }
    
    a // a正常输出
    
    b();  // 错误log
    ^
    TypeError: undefined is not a function
    

    reply
    0
  • PHPz

    PHPz2017-04-10 15:16:00

    以下是个人观点,如有错误请尽情指正:
    首先我觉得在使用上来说是没有区别的,有区别的是,
    当js代码在执行之前会产生一个执行上下文,此时如果你用的是
    var some = function() {
    //do something
    }
    那么执行上下文中some的值是undefined,所以此时如果你先使用了some,那就会报错,因为他还不是function,这就是函数变量提升。
    而如果你使用的是
    function some() {
    //do something
    }
    那么执行上下文中就有这个function了,所以你可以在任意地方使用它,而不用纠结于必需先定义function 后使用!

    reply
    0
  • PHP中文网

    PHP中文网2017-04-10 15:16:00

    第一个是函数声明,第二个是函数表达式

    reply
    0
  • 阿神

    阿神2017-04-10 15:16:00

    一个是函数声明,一个是函数表达式
    函数声明会被提前到顶部,在所有var变量声明的前面
    而函数表达式和普通的变量声明没有区别

    reply
    0
  • 天蓬老师

    天蓬老师2017-04-10 15:16:00

    这个可以尝试看一下红皮书或者犀牛书。

    reply
    0
  • ringa_lee

    ringa_lee2017-04-10 15:16:00

    当然有区别,概念上一个是函数声明,一个是函数表达式。
    效果上我知道2点区别:

    1:

    a();
    b();
    
    function a () {};
    var b = function () {};
    // 函数声明会被提升(所有声明都会被提升)
    

    以上代码等价于下面的代码

    var a = function a () {};
    var b = undefined;
    a();
    b();
    b = function () {};
    

    2:

    // 定义后立刻添加括号调用
    function a(){}(); // 不会执行
    var b = function (){}(); // 会执行
    

    reply
    0
  • 高洛峰

    高洛峰2017-04-10 15:16:00

    同意二楼的说法,
    Js虽然是从上到下顺序执行的,但是Js在顺序解析前会创建上下文,像function声明这样的块区域会先被解析,如果代码中有多出声明function xx()都会先被解析。
    后者用var xx = xxx声明的是一个变量,变量的地址指向了一个匿名函数,这样的代码是在顺序执行的时候解析的,所以也是执行到这行的时候匿名函数才被创建。
    理解代码解析的原理后,可以根据代码的业务需求酌情使用。

    reply
    0
  • 黄舟

    黄舟2017-04-10 15:16:00

    汤姆大叔的博客有写:
    http://www.cnblogs.com/TomXu/archive/2011/12/29/2290308.html

    reply
    0
  • Cancelreply