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

作者:代码拾荒时间:2026-10-22 11:37:04浏览:648

本文解析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的修正版。

作者最新文章