宝哥软件园

谈谈javascript函数表达式和函数声明的区别

编辑:宝哥软件园 来源:互联网 时间:2021-09-19

javascript中声明函数的方法有两种:函数声明和函数表达式。

区别如下:

1).对于函数声明方法定义的函数,函数名是必须的,函数表达式的函数名是可选的。

2).函数声明的方法定义的函数可以在函数声明之前调用,而函数表达式的函数只能在声明之后调用。

3).由函数声明的方法定义的函数不是真正的声明,它们只能出现在全局或嵌套在其他函数中,但不能出现在循环、条件或try/catch/finally中。

函数可以在任何地方声明。

以下两种方法用于定义函数:

//函数声明性函数hello(){ console . log(' hello world ');}//函数表达式var hello=function(){ console . log(' hello world ');}下面是一个有趣的javascript:

function f() { console.log('我在外面!');}(function () {if(false) {//声明函数f function(){ console . log('我在里面!')再一次。);} } f();}());会输出什么?第一反应应该是‘我在外面’。结果就是‘我在里面’,在chrome中IE11输出,IE11直接报错,火狐的低版本输出‘我在外面’。

chrome的输出清晰地反映了函数声明所声明的函数的特性——函数可以在声明之前被调用。

IE错误说明对象缺失,因为函数是在条件中声明的,违反了函数声明的原则。

表达范围:

如果函数表达式声明的函数有一个函数名,那么这个函数名就相当于这个函数的局部变量,只能在函数内部调用,例如栗子:

var f=函数fact(x) { if (x=1)返回1;else返回x * fact(x-1);};alert(fact());//unsightreferenceerror : fact未定义fact()可以在函数内部调用,但在函数外部调用时会报告错误。

让我们仔细看看。

函数声明

函数声明的示例代码。

代码:如下。

函数fn () {console.log('fn函数执行.');//代码.}所以我们声明了一个名为fn的函数。这里有一个想法。你认为在这个函数上面调用它会被执行吗?还是会报错?

下面的代码是: fn();//调用我们声明的fn函数fn () {console.log('fn函数执行.')之前;//代码.}

控制台输出结果:

是的,此时可以调用fn函数。以下是原因总结。

总结:

1:此时fn函数是变量的结果,默认存储在全局上下文的变量中(可以通过window验证。函数名)。

2:这个方法是一个函数声明,在全局上下文阶段创建,在代码执行阶段可用。PS: JavaScript每次进入一个方法都会初始化上下文(从全局到局部)。

3:它可以影响变量对象(只有存储在上下文中的变量)。

函数表达式

函数示例代码。

代码:如下。

var fn=function(){ console . log(' fn function[expression]声明执行.')//代码.}所以我们声明了一个匿名函数,并将其引用指向变量fn?

在表达式声明的函数的上方和下方再次调用,查看控制台的输出。

代码:如下。

//为了清楚地看到控制台的输出,我们在每次调用前后都做了标记,以提高可读性。Console.log('启动前调用.');fn();Console.log('呼叫在.之前结束');var fn=function(){ console . log(' fn function[expression]声明执行.')///代码.}console.log('呼叫在.之后开始');fn();Console.log('调用开始于.');控制台打印结果:

可以看到,当代码执行到第一次调用fn()函数时,会提示:fn不是函数(fn不是方法),遇到错误后停止运行。

这说明第一次调用fn()时,var fn变量并不作为全局对象的属性存在,fn引用的匿名函数上下文也没有初始化,所以在他之前调用失败。

代码:如下。

//现在注释掉前面的调用逻辑,然后查看控制台输出//console . log(‘调用在.之前开始’);//fn();//console.log('调用在.之前结束');var fn=function(){ console . log(' fn function[expression]声明执行.')//代码.} console.log('呼叫在.之后开始');fn();//在表达式后调用console.log在.后调用start’);控制台打印结果:

可见在表达式函数之后调用是可以的,来总结一下为什么?

总结:

1:首先,变量本身不是作为函数存在的,而是匿名函数的引用(值类型不是引用)。

2.在代码执行阶段,初始化全局上下文时,不作为全局属性存在,不会造成变量对象的污染。

3.这种类型的声明在插件开发中很常见,也可以用作闭包中回调函数的调用。

因此,函数fn () {}不等于var fn=function () {},但它们本质上是不同的。

以上就是本文的全部内容。思路清晰,对比清晰。这是一篇非常好的文章。我的朋友们必须仔细研究它。

更多资讯
游戏推荐
更多+