函数创建的方法:
1.函数声明
function a(){
函数体
}
2.函数表达式
var a = function(){
函数体
}
使用条件: (1)、函数当成值,赋值给变量
(2)、创建了一个对象,给obj,添加一个方法
(3)、当一个函数,被作为一个回调函数
3.命名函数表达式
var a = function b(){
函数体
//可以访问到b函数,而在函数外面,是访问不到b的;和函数声明有很大的不同,递归中可能会用到
}
4.箭头函数
(a,b)=>{return a+b}
如果只有一个参数,可以省略()
a=>{return a++}
如果函数体只有一条,可以省略{}
a=> a++
5.函数生成器 ES6中
function* quips(name) {
yield "你好 " + name + "!";
yield "希望你能喜欢这篇介绍ES6的译文";
if (name.startsWith("X")) {
yield "你的名字 " + name + " 首字母是X,这很酷!";
}
yield "我们下次再见!";
}
普通函数使用function声明,而生成器函数使用function*声明。
在生成器函数内部,有一种类似return的语法:关键字yield。
二者的区别是,普通函数只可以return一次,而生成器函数可以yield多次(当然也可以只yield一次)。
在生成器的执行过程中,遇到yield表达式立即暂停,后续可恢复执行状态。
6.函数构造器-不推荐 1、写起来太复杂2、出入的字符串需要eval解析,效率低
var a = new Function('a','b','return a+b');
函数声明,转化成立即执行函数(IIFA)的几种方法:
立即执行函数的优点:1、解决作用域下,命名污染的问题;2、对整个程序的性能有提升,减少了对作用域的查找;3、有利于压缩;4、避免全局命名的冲突 5、保存闭包状态 6、使用UMD结构,去颠倒代码运行顺序
// 使用操作符
(function(){
console.log(1111);
})();
(function(){
console.log(1111);
}());
var a = function(){
console.log(2222);
}();
true&&function(){
console.log(3333);
}();
false||function(){
console.log(4444);
}();
0,function(){
console.log(5555);
}();
// 使用一元运算符 + - ~
+function(){
console.log(6666);
}();
-function(){
console.log(7777);
}();
~function(){
console.log(8888);
}();
!function(){
console.log(8888);
}();
new function(){
console.log(9999);
};
一元运算符转化的效率低一些,不如操作符