JS函数声明与函数表达式的区别

函数声明与函数表达式的区别

前面我们已经说了两种定义函数的方式:函数声明与函数表达式。那么这两种方式有区别吗,还是一样的呢?下面我们来进一步探讨探讨。

下面我们定义了两个函数分别为 hello 和 hi,前者采用函数声明,后者采用函数表达式,然后再调用,如下:

function hello () {
    console.log('Hello the world');
}

var hi = function () {
    console.log('Hi, IMWeb');
}

hello(); // 'Hello the world'
hi(); // 'Hi, IMWeb'

上面的调用,我们都能得到正确的运行,并没有什么区别。但是如果我们把顺序掉下,先调用函数后定义函数,那么情况就会有点不一样了。如下:

hello(); // 'Hello the world'
hi(); // Uncaught TypeError: hi is not a function

function hello () {
    console.log('Hello the world');
}

var hi = function () {
    console.log('Hi, IMWeb');
}

从上我们可以看到,hello 函数可以照常运行,但是我们的 hi 函数就会报错了。根据报错“Uncaught TypeError: hi is not a function”,我们知道 hi 不是 function 了,那又是什么呢?我们继续使用 typeof 查看下:

console.log(typeof hello); // function
console.log(typeof hi); // undefined

function hello () {
    console.log('Hello the world');
}

var hi = function () {
    console.log('Hi, IMWeb');
}
function hello () {
    console.log('Hello the world');
}
var hi;

console.log(typeof hello); // function
console.log(typeof hi); // undefined

hi = function () {
    console.log('Hi, IMWeb');
}

通过 typeof 我们可以看到 hi 现在是个 undefined 了,这是为什么呢?

这是因为 JavaScript 解释器中存在一种变量声明被提升(hoisting)的机制,也就是说变量(函数)的声明会被提升到当前作用域的最前面,即使写代码的时候是写在最后面,也还是会被提升至最前面。

这样上面的例子在执行的时候就成了这样的:

这样是不是一下就恍然大悟了。所以在实际开发的时候,一定要注意变量(函数)的声明会被提升到当前作用域的最前面

 

本文章转载于IMWeb

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值