js基础篇:2、函数声明与函数表达式的区别

函数的创建

    创建一个函数的方法有以下三种:

  • 函数声明
  • 函数表达式
  • 构造函数

表达方式

函数的三种创建方法中,我们最常用的是为函数声明函数表达式

1.函数声明

  • 基本写法
function adders(num){
	return num+=1
};

注意: 函数声明会进行函数提升,所以在函数被定义之前也可以调用,但是不能立即执行,因为函数声明提前后相当于只留下一对括号而报错。

  • 立即执行会报错
function adders(num){
	return num+=1
}(); // Uncaught SyntaxError: Unexpected token )

这是因为声明操作会被提升到执行环境顶部,并赋值undefined,而赋值操作被留在原地等到执行,因此无法立即执行。

(function adders(num){
	return num+=1
})(1); // 2

如果用()把函数声明包起来那么它就是个函数表达式,能立即执行,并且这么类似造了个作用域容器,里面的变量不受外界影响,也无法调用,这么做可以防止全局污染

2.函数表达式

  • 基本写法
var adders = function(num){
	return num+=1
}

函数表达式通常是把一个匿名函数赋值给一个变量。

  • 如何将匿名函数变为函数表达式并执行
!function(e){console.log(e)}('test1')  // test1
(function(e){console.log(e)})('test2') // test2
+function(e){console.log(e)}('test3')  // test3

函数表达式不会变量提升,所以只有在创建了函数后面,我们在能执行函数的调用,但是函数表达式可以立即执行。我们给匿名函数添加! () + -等符号都可以使其变为函数表达式从而能实现立即执行的好处。

3.构造函数

  • 基本写法
var adders = new Function('a','b','console.log(a+b)') //第三个参数为要执行的函数。
adders(1,2) // 3

使用Function构造器生成的Function对象是在函数创建时解析的。这比你使用函数声明或者函数表达式(function)并在你的代码中调用更为低效,因为使用后者创建的函数是跟其他代码一起解析的。这里我就暂时不对构造函数进行过多的分析了。

总结

是否提升能否立即执行能否匿名
函数声明     √         ×     ×
函数表达式     ×         √     √
构造函数     ×         √      -

那么

如果我们把函数声明写到一个条件判断里面去,那么结果会是怎么样的呢?

console.log(test); // undefined
if (ture) {
    function test(){ console.log(100); }
}
test();

这么写的话会在不同版本的浏览器产生不同的结果,新版本浏览器可能会输出 //TypeError: a is not a function ,在旧版本浏览器控制台就是输出100。为了避免这种情况,我们应该尽可能的避免把函数声明写进控制语句里去。

转载于:https://my.oschina.net/chendejie/blog/3075540

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值