首页 > js函数声明的区别

js函数声明的区别

请问下js中声明函数:

function some() {
   //do something
}

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

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


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

a();
b();


function a(){
    console.log('a');
}

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

a // a正常输出

b();  // 错误log
^
TypeError: undefined is not a function

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


当然有区别,概念上一个是函数声明,一个是函数表达式。
效果上我知道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 (){}(); // 会执行

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


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


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


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


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的声明被整个提升了

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

【热门文章】
【热门文章】