函数
函数主要是放置一个代码块,放置的代码块不会自动运行,需要用函数控制代码区块的运行。调用函数就可以让代码区块的代码运行。
创建函数
1.
通过
function
命令创建函数
// function 创建函数,函数一般需要一个函数名称,名称后面需要一个()。有函数名称的叫具名函数(有函数名的
函数)
function fn1(){ // 函数是引用数据类型,funxtion创建的函数是在堆内存里面,fn1函数名称对应的函
数的堆内存的内存地址。
var a = 10;
var b = 5;
console.log(a * b)
}
// 调用函数: 函数名称加()
fn1()
2.
函数表达式的方式创建,把一个函数赋值给变量
var f2 = function(){
console.log("f2")
}
f2() // 调用函数
3.
用
Function(argument,...,body)
构造函数创建函数。
argument
是函数的参数,
body
是函数的主体
(
函数代码区
块
)
。一般用于将字符串转为
js
代码运行。
var f3 = new Function("console.log('f3')")
console.log(typeof f3)
f3()
4.
匿名函数,没有名字的函数
,之间
写匿名函数需要加
(),
一般没有特殊需求不会用匿名函数。小括号前面的语句需要加分号。
fn1();
// 2. 匿名函数,没有名字的函数,之间写匿名函数需要加(),一般没有特殊需求不会用匿名函数。小括号前面
的语句需要加分号。
(function(){
333
})
5.
函数的重复声明
,
后声明函数覆盖前面声明函数
function fa(){
console.log("fa")
}
function fa(){
console.log("fa----repeat")
}
fa()
函数参数
6.
函数的小括号里面创建的变量就叫参数,也叫形参
(
没有赋值的变量
),
形参的数量没有限制
,
多个参数用逗号分割。形参默认值是undefifined
function fc(a,b,c){
console.log(a+b+c)
}
fc(10,4,6) // 调用给函数传的值叫实参(实际参数是给形参赋值的),调用函数不一定每一个参数都要赋值。
根据情况看是否需要传参
7.
形参设置默认值
,
如果传递了参数形参则是传递参数,如果没有传递参数,则用默认值。
function fd(a=1,b=1,c=1){
console.log(a+b+c)
}
fd(10);
8. arguments
能获取到函数的实参
,
是一个类似数组对象
function fn1(){
// 取出arguments里面的所有实参
for(var i=0;i<arguments.length;i++){
console.log(arguments[i])
}
}
fn1(1,2,"a")
9.
函数提升,
function
创建的函数在
js
编译的时候提升到代码顶部。
由于有函数提升,所以在函数创建前面调用函数不会报错。函数名和变量名相同,是函数名覆盖变量名项目中尽量不要用函数或变量提升特性在创建前使用函数或者变量。
fn2()
function fn2(){
console.log("fn2")
}
var fn2
console.log(fn2)
10. 回调函数: 把一个函数作为实参传递给另外一个函数
// 把callback参数当做一个函数
function fn3(callback){
callback()
}
var fx = function(){
console.log("xxxx")
}
// 调用fn3 把fx函数作为参数传递到fn3,fn3的callback就是fn3函数
11.
回调函数的参数
function fna(callback){
// 要找到callback参数对应的是哪个函数,10就是给该函数传递的参数
callback(10)
}
var fxa = function(num){
console.log(num)
}
// 调用fn3 把fx函数作为参数传递到fn3,fn3的callback就是fn3函数
fna(fxa)
12. return
返回值函数
,
可以把函数内部的值返回到函数外部。如果函数没有
return
关键词,默认返回到外面的是一 个undefifined
function f4(){
var a = 10
var b = 10
var c = a*b
// return 也是函数运行结束标志,return后面的代码不会执行
return c
console.log("oooooooo")
}
// f4() 函数运行会把return 后面的结果返回到函数外面,这里是把c变量返回到函数外面,相当于f4() 运行后
就得到c,再把c赋值给res变量。
var res = f4()
console.log(res)
13.
全局变量和局部变量
- 在函数外面创建的变量就是全局变量,可以在js文件的任意位置使用。
- 在函数内部创建的变量就是局部变量,局部变量只能在函数内部使用。
- 向在函数外部获取函数内部是局部变量值,可以用return把局部变量值返回到函数外部
{ var x = 100 function f4(){ // 局部变量也存在变量提升,是提升在函数顶部 console.log(a, "----") var a = "a100" var x = 50 console.log(x, "++") console.log(a) return a } var test = f4() console.log(test) // console.log(a) } console.log(x, "++")
-
() 小括号可以立即运行函数
function f5(){ console.log("1-------") } f5(); // 立即运行一个匿名函数 (function(a){ console.log("匿名函数",a) })("1")
-
闭包: 函数内部返回一个函数
作用: 把函数内部的变量持久的放在内存中。
function f7(){ var a = 0 // return 返回一个函数 return function(){ a++ console.log(a) } } // 调用f7函数就拿到了return返回的函数 // f7a 等于f7函数返回的匿名函数 var f7a = f7() // 调用f7a函数相当于是执行f7返回的匿名函数 f7a() f7a() f7a()
-
递归函数:函数调用自身函数 ( 类似无限循环 )使用递归函数需要有结束条件,不能无限调用 , 不然就会内存溢出
// 使用递归函数需要有结束条件,不能无限调用,不然就会内存溢出
{
function f8(){
console.log(1)
// f8()
}
f8()
// 案例: 1-5的阶乘(1*2*3*4*5)
// 1. 创建一个函数,函数要写出需要的结果
// 2. 递归函数必须要有一个结束递归的条件
// 3. 递归函数是从最里层(最后一个函数,结束条件开始)开始计算
function countNum(num){
// 递归结束的条件当num=1丁久结束
if(num === 1){
return 1
}
// 想要的阶乘结果
return num*countNum(num-1)
}
console.log(countNum(4))
}
js的垃圾回收机制
编程中的垃圾指的是用过的变量。由于变量会产生对应的内存空间,如果一个变量使用完了不去把对应的内存释放,容易造成内存溢出。js
程序自带一套垃圾回收机制,
js
会自动判断不用的变量内存会被释放调。
js
变量不使用的时候,或者
js
变量在使用完成后会自动销毁。局部变量会自动销毁,用
var
关键词创建的全局变量则是在应用关闭时候才销毁。