一、函数定义方式
1.具名函数
function fn(){
console.log('this is a function')
2.匿名函数(函数表达式)
var fn = function(){
console.log('赋值表达式函数')
}
3.内置构造函数
var c = new Function("a", "b", "return a+b");
console.log(c(2, 3));
二、函数的调用方式
1.函数名()
var a = function () {
console.log("函数名()");
}
window.a();
a();
2.自调用
var b = (function () {
console.log("b");
})();
3.call()调用
c.call();
4.对象中的函数调用
var d = {
name: "d",
play: function () {
console.log(d)
}
}
d.play();
5.数组中函数调用
var e = [
function () {
console.log(eeeee);
}
];
console.log(arr[0]);
6.函数作为参数的调用
function f(ff) {
ff();
}
f(function () { console.log(“ffff”)});
7.函数作为返回值的调用
function g() {
return function () { console.log("ggggg") }
}
g()();
三、改变this的指向的方法
1.call()
1.调用函数
function a() {
console.log(111);
}
a();
a.call();
//打印效果等同
2.call会改变this的指向,分两种情况,一种是没有参数,一种是有一个参数
//没有参数,this指向window,打印“我叫狗”
var Cat = {
name: "猫",
callName: function () {
console.log("我叫" + this.name);
},
};
var name = "狗";
Cat.callName.call();
//有参数,this指向参数,打印“我叫狗”
var cat = {
name: "猫",
callName: function () {
console.log("我叫" + this.name);
},
};
var dog = {
name: "狗",
};
cat.callName.call(dog);
3. call会改变this的指向,有多个参数,this指向第一个参数,剩下的是个参数列表
2.apply()
和call()只有最后一点有区别,只有两个参数,第一个是this,第二个是个参数的数组
3.bind()
1.不能调用函数,返回值是个函数,要.band()()才能调用
四.arguments
任何一个对象都有内置函数arguments,他是个伪数组
1.arguments里面存的是传入函数的实参,跟形参有多少个没关系。
2.length:实参的个数
3.callee.length:形参的个数
4.callee.name:函数名
5.函数名.caller:函数的调用者(不常用)
五.作用域及作用域链
1.作用域分为全局作用域和局部作用域,函数里的作用域就是局部作用域,函数外的作用域就是全局作用域。
2.作用域链就是指从局部作用域到全局作用域的这条链。比如一个变量在函数中被用到了,他要找到这个变量才能使用,代码才能继续执行,他会先在函数中找这个变量的声明,如果没有就去全局里面找。就是这样的一个链。
六.闭包
闭包可以理解成“定义在一个函数内部的函数“。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。作用就是用来“锁值”,这么说肯定不好理解,还是靠实例说话。
function getRandom(min, max) {
var num = Math.floor(Math.random() * (max - min) + min);
console.log("num:" + num);
// 闭包
return function () {
console.log(num);
};
}
var result = getRandom(1, 10);
result();
result();
虽然函数里面打印的是个随机数,但两次result()的结果相同,因为result接收了返回的function,加了个小括号执行了这个函数,根据作用域链,本身函数里没num去上一级函数里找,找到num,并打印,执行的是返回的函数,此时num已经固定不会改变,这就说明了闭包“锁值”的能力。
七.递归
一句话,函数自己调用自己完成一个功能,就是递归。
三步走:1.找规律
2.写规律
3.写临界情况
举个例子:斐波那切数列
function fei(n) {
if (n == 1) {
return 0;
}
if (n == 2) {
return 1;
}
// console.log(111);
return fei(n - 1) + fei(n - 2);
}
console.log(fei(7));