一、函数定义:
1、使用函数声明
1 function functionName(patameters) { 2 // 3 }
2、使用函数表达式
函数表达式可以在变量中存储;
let x = function(a, b) { return a * b };
在变量中保存函数表达式之后,此变量可用作函数。
该函数实际上是一个匿名函数。存放在变量中的函数不需要函数名,它们总是使用变量名调用。
上面的函数使用分号结尾,因为它是可执行语句的一部分。
二、函数提升(hoisting)
Hoisting应用于变量声明和函数声明。
使用表达式定义的函数不会被提升。
三、自调用函数
函数表达式后面跟着()时,函数表达式会自动执行,而且需要在函数周围添加括号,以指示它是一个函数表达式。
注意:函数声明无法进行自调用。
(function () { let a = "aaaa" })();
此函数实际上是一个匿名的自调用函数。
四、箭头函数
// ES5 var x = function(x, y) { return x * y } // ES6 const x = (x,y) => x * y;
箭头函数没有自己的this,它们不适合定义对象方法。
箭头函数未被提升,必须使用前进行定义。
使用const比使用var更安全,因为函数表达式始终是常量值。
函数参数问题:
形参:parameter
实参: argument
如果调用函数时省略了参数(少于被声明的数量),则丢失的值被设置为:undefined。
JS函数有一个名为arguments对象的内置对象,arguments对象包含函数使用时使用的参数数组。
JS 的call()方法:
call()方法是预定义的js方法,它可以用来调用所有者对象作为参数的方法,通过call(),可以使用属于另一个对象的方法。
eg:
let person = { fullName: function() { return this.firstName + " " + this.lastName; } } let person1 = { firstName: "A", lastName: "B" } let person2 = { firstName: "C", lastName: "D" } person.fullname.call(person1); // 将返回A B
call()方法也可接受参数
与call()方法类似的方法apply()方法二者区别:
call()方法分别接受参数;
apply()方法接受数组形式的参数。
闭包:
概念:闭包就是通过函数嵌套,能够访问另一个函数作用域变量的函数。
function a() { var x = ‘123‘; var b = function() { console.log(x) } return b //这里b就是一个闭包 }
闭包的特点:外部函数的参数和变量不会被垃圾回收机制回收。
原因:首先需要知道一个正常的单独函数当它执行结束后,它内部的定义的变量随即销毁,在js里定义的全局变量只有在程序结束才会被销毁,以及具有引用关系的对象也不会被销毁。
而在闭包函数中,a中的变量被b函数所引用,这时如果b函数赋给一个变量,那么这时a,b函数通过变量名调用后都不会被销毁,如下:
function a() { var x = ‘123‘; // console.log(‘dfadf‘) var b = function() { x = x+1 console.log(x) } return b //这里b就是一个闭包 } var f = a() f() f()
结果:
如果没有使用变量,而是直接调用函数名:
function a() { var x = ‘123‘; var b = function() { x = x+1 console.log(x) } return b //这里b就是一个闭包 } a()() a()()
结果:
可以看出,如果没有赋给一个变量,函数调用一次之后创建的变量都会被回收,再次调用时会重新创建。
原文:https://www.cnblogs.com/pureshee/p/12886402.html