普通函数
//函数声名
function fun(){
console.log("hello world")
}
//调用函数
fun();//hello world
带参数的函数
//函数声名
function add(a,b){
return a+b;
}
//调用函数
var result = add(1,2);
console.log(result);
回调函数和匿名函数
回调函数:将函数作为参数,传递给另一个函数
匿名函数:javascript没有命名的函数,仅调用一次,常用于回调函数
setTimeout(function(){
console.log('hello world');
},500)
//0.5s后输出一次hello world
函数表达式
const add = function(a,b){
return a+b;
}
let result = add(10,20);
console.log(result);//30
函数表达式和普通函数的区别在于,是否需要将声名提前
函数表达式必须提前声名函数
立即执行函数(不常用)
(function(){})()
立即执行函数:声明之后立刻执行的函数
以前常用于封装代码:
(function(){
var a = 1;
var b = 2;
console.log(a + b)
})()
该函数输出a + b的结果,但是立即执行函数外部不能访问变量a和b,从而达到封装的目的。
闭包函数和闭包
闭包函数:声名在一个函数内的函数
闭包:内部函数总是可以访问其所在的外部函数中声名的参数和变量,即使在其外部函数被返回了之后。
例子1
(function(){
function add(a, b){
return a + b
}
let result = add(1, 2)
console.log(result)
})()
立即函数内部的add函数就是闭包,闭包的特点是具有全局性,闭包内部的this关键字会指向全局对象window。
例子2
//闭包的特性:内部函数未执行完,外部函数即使执行完成,外部函数中的变量也不会被销毁
function fun1(){
var n =1;
var m =2;
function fun2(){
return n+m;
}
return fun2;
}
const f = fun1();//外部函数执行完毕
const result = f();
console.log(result);//3
箭头函数
//函数表达式
const addself = function(x){
return x+x;
}
//箭头函数 ()=>{}
const addself= (x)=>{
return x+x;
}
//更简
const addself = x=>x+x;
箭头函数中的this:使用function定义的函数,this取决于调用该函数的对象。使用箭头函数,this取决于函数定义的位置。
const cat = {
name:"meow",
sayName(){
console.log(this.name)
}
}
cat.sayName();//meow
const cat = {
name:"meow",
sayName(){
setInterval(function(){
console.log(this.name);
},500)
}
}
cat.sayName();//输出一系列空白,原因是,这里的this是setInterval的context 即window,而window.name并没有定义
const cat = {
name:"meow",
sayName(){
setInterval(()=>{
console.log(this.name);
},500)
}
}
cat.sayName();//输出一系列的meow,原因是,这里的this取决于定义的位置,即cat