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