请问下js中声明函数:
function some() {
//do something
}
和
var some = function() {
//do something
}
有区别吗?
我目前没有发现他们的区别,有没有什么场景需要选择某一种更好呢?谢谢
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的声明被整个提升了
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
PHPz2017-04-10 15:16:00
以下是个人观点,如有错误请尽情指正:
首先我觉得在使用上来说是没有区别的,有区别的是,
当js代码在执行之前会产生一个执行上下文,此时如果你用的是
var some = function() {
//do something
}
那么执行上下文中some的值是undefined,所以此时如果你先使用了some,那就会报错,因为他还不是function,这就是函数变量提升。
而如果你使用的是
function some() {
//do something
}
那么执行上下文中就有这个function了,所以你可以在任意地方使用它,而不用纠结于必需先定义function 后使用!
ringa_lee2017-04-10 15:16:00
当然有区别,概念上一个是函数声明,一个是函数表达式。
效果上我知道2点区别:
a();
b();
function a () {};
var b = function () {};
// 函数声明会被提升(所有声明都会被提升)
以上代码等价于下面的代码
var a = function a () {};
var b = undefined;
a();
b();
b = function () {};
// 定义后立刻添加括号调用
function a(){}(); // 不会执行
var b = function (){}(); // 会执行
高洛峰2017-04-10 15:16:00
同意二楼的说法,
Js虽然是从上到下顺序执行的,但是Js在顺序解析前会创建上下文,像function
声明这样的块区域会先被解析,如果代码中有多出声明function xx()
都会先被解析。
后者用var xx = xxx
声明的是一个变量,变量的地址指向了一个匿名函数,这样的代码是在顺序执行的时候解析的,所以也是执行到这行的时候匿名函数才被创建。
理解代码解析的原理后,可以根据代码的业务需求酌情使用。