JavaScript中函数声明与函数表达式的区别
本文解析JavaScript中函数声明与函数表达式的核心区别。通过对比var b=function test(){}与function test(){},说明命名函数表达式不会将内部名称绑定到外部作用域,而在IE等旧版浏览器中可能存在行为异常。
JavaScript函数声明与表达式的基本区别
function test(){
return 123;
}
这显然是一个标准的函数声明。那么接下来的写法又是什么情况呢?
var b=function(){return 123};
很多人会对这种写法产生疑惑,因为它看起来不像函数声明,因为函数没有名字,这只是一个匿名函数。让我们继续看下面的例子。
命名函数表达式的内部名称绑定问题
var b=function test(){return 123};
这到底是不是函数声明呢?表面上看似乎是的,但我的回答是:不是。
alert(test);
var b=function test(){return 123};
你可以在非IE的任何JavaScript实现中测试这段代码,它会报告test未定义的错误。那么如果尝试访问b呢?
var b=function test(){return 123};
alert(b);
alert(test);
第一个alert会显示出function test(){...}这样的函数toString结果,但第二个alert仍然会抛出异常。为什么呢?这是因为这里的function test(){return 123}并不是一个函数声明,而是一个函数对象,它的引用被赋值给了变量b。因此,它不会像真正的函数声明那样,默认将函数对象绑定到test这个名字上。
IE浏览器的特殊行为与历史背景
alert(test);
var b=function test(){return 123};
为什么不使用IE进行测试呢?因为在IE中,alert(test)会显示函数内容。IE似乎比较“笨”,无法区分单独的function声明和等号右边的函数对象。此外,IE甚至支持function String.prototype.test(){...}这样的声明。可见IE的JavaScript实现确实存在不少Bug,这也难怪Wilson不支持ES4,非要搞一个ES3.1出来,其实那只是对Bug的修正版。
JavaScript异步发送HTTP请求时怎么优雅地处理错误
2026-11-05 17:10:44
5款主流JS在线运行工具对比:CodePen、JSFiddle与StackBlitz怎么选
2026-11-05 17:04:04
JavaScript入门书籍避坑:这些书不适合初学者
2026-11-05 16:31:15
JS使用Math.round实现保留两位小数的原理与代码
2026-11-05 15:35:55
JavaScript 原生 Date 对象怎么实现日期加减
2026-11-05 14:30:00
