函数是由事件驱动的或者当他被调用执行的可重复使用的代码块。函数是包裹在花括号中的代码块,使用关键字function;当调用该函数时,就会执行函数内的代码。在JavaScript任何位置都可以调用函数。函数实际上也是对象,每一个函数都是function类型的实例,函数名实际上也是一个指向函数对象的指针。
调用函数时,往里头传递数值时,这些值被称为参数;传递进去的值为形参;接受数据的为实参
function age(a,b){ //a b 为接受传递数据的值 为形参
var x=a+b;
return x; //返回值返回到调用它的地方
}
var sum= age(7,10) //很明显这里传递的是实际数,实参
console.log(sum) //结果17
函数的声明与var类似会产生一个变量声明提前
函数根据参数分为显式参数(例如前面的x,a,b)和隐式参数(arguments);JavaScript函数有个内置的对象arguments对象,其包含了函数调用的参数数组(将传递进来的参数当成一个数组),本身相当于一个类数组;
// 创造一个函数,利用arguments计算和
x = sumAll(1, 123, 500, 115, 44, 88);
function sumAll(a,b) { //哪怕这里设置了形参来接受2个数,但是传进来的还是6个,arguments接受的是传进来的所有数。
var i, sum = 0;
for (i = 0; i < arguments.length; i++) {
sum += arguments[i];
}
return sum;
}
console.log(x);
this 函数调用
在方法中,this表示该方法所属对象;单独使用则表示全局对象;在函数中为全局对象,严格模式下,是未定义的;在事件中,this表示接收事件的元素;使用call和apply方法可以将this引用到任何对象(允许切换函数执行上下文环境,即this绑定的对象)。
注意this是被谁调用的
var name = 'window'
var obj = {
name: 'obj',
say: function () {
console.log(this.name); //this对象只是指向上一级调用的对象,不存在链表,say是被obj对象调用,所以这里可以找到'name' ;下面不行
return function () {
console.log(this.name); //undefined 这里是将obj.say()赋值给了x,x是一个全局对象,是被window是调用,全局获取不到name,所以是undefined
}
}
}
var x = obj.say() //将方法赋值给x
x()
回调函数:回调函数实现异步编程,例如:们可以一边读取文件,一边执行其他命令,在文件读取完成后,我们将文件内容作为回调函数的参数返回。这样在执行代码时就没有阻塞或等待文件 I/O 操作。这就大大提高了 Node.js 的性能,可以处理大量的并发请求。
定义主函数,回调函数作为参数
function A(callback) {
callback(); //在A中调用B
console.log('先执行');
}
//定义回调函数
function B() {
// 模仿延时操作
setTimeout(() => {
console.log('后执行');
}, 3000);
}
//调用主函数,将函数B传进去
A(B);
//因为加了一个延时操作,所以B才会后执行,函数顺序还是从上到下的!!这里就是为了解释回调
闭包:就是也权访问另一个函数作用域中的变量的函数;闭包生成的三个条件:1.函数嵌套函数;2.内部函数引用了外部函数中的数据/属性;3.参数和变量不会回收。(最常见的闭包的创建方法就是在一个函数内部创建另一个函数)
function f1() {
var n = 999;
nAdd = function () { n += 1 } //定义一个全局变量,没有被执行调用,就没有意义
function f2() {
console.log(n);
}
return f2;
}
var result = f1();
result(); // 999
nAdd();
result(); // 1000
//ps:是看其他大佬还有一些资料写的!!!