函数的创建
创建一个函数的方法有以下三种:
- 函数声明
- 函数表达式
- 构造函数
表达方式
函数的三种创建方法中,我们最常用的是为函数声明和函数表达式。
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
。为了避免这种情况,我们应该尽可能的避免把函数声明写进控制语句里去。