函数与作用域 学习总结
封面画师:唏嘘的星辰 p站ID:13312138
函数
面向对象三大特点
: 继承
多态
封装
,函数
: 代码集合体,把相同功能代码封装到一个函数体里面,以后这个函数重复使用了,
不带参数的函数封装
// 关键字 函数名 (形参){函数体}
function add(){
var a = 10
var b = "10"
var c = a+b //+ 加法运算,必须保证都是数字;
// var c = a / b // 可以把字符串转成数字,然后再去计算
// var c = a * b // 把字符串转成数字一种方式,这种方式称为隐式转换
if(b){
// 如果a数字, 非0都为true
// 如果字符串 非""都为true
// 如果布尔值 true就是true,
// 如果是空数组 为true
// 如果是空对象 为true
// 如果undefined 为false
// null 不存在 为false
console.log(c)
}
}
// 必须调用:函数名()
add()
递归引入
// 1 1 2 3 5 8 13 21
function f1(){
console.log("f1")
// too much recursion 函数体里面调用自己 造成死循环,需要合适的地方跳出,就是递归思想
// f1()
}
f1()
带参数的函数封装
// a,b,c 多个参数用逗号隔开,形参:在定义的时候没值
function f2(a,b,c){
console.log("我的名字是"+a+"年龄是"+b+"性别是"+c)
}
f2("张三",10,"男") // "张三" 实参, 函数调用的时候,把实参的赋值给形参
带默认参数的函数的封装
带默认参数的函数的封装,把默认参数写在最后一位
function f3(name,stuid,sex="男"){
console.log("我的名字是"+name+"性别是"+sex+"学号是"+stuid)
}
f3("李四","001") //如果给默认参数传值了,默认参数就是传递的数据,如果不传值,默认参数就是默认值
f3("张三","002","女")
f3("张三","男","003")
有返回值的函数
有返回值的函数,必须带关键字return
function f4(a,b,c){
return a * b *c
}
var aa = f4(10,10,10)
console.log(aa)
作用域
全局作用域
: 在script标签定义的变量。就是一个全局变量,可以在任何地方去使用。局部作用域
: 在函数体定义的变量,就是一个局部变量,只能用在当前的函数体中块级作用域
: 在代码块{}定义的变量,采用let进行定义,只能用在当前代码块里面var a = 10 //全局的变量 function f1(){ console.log(a) } f1() //var 变量提升只会把变量声明提升到当前作用域最前面 function f2(){ console.log(b,"--------") var b = 10 //局部变量 console.log(b,"--------") } f2() // console.log(b) // 局部变量只能用在定义函数体里面 // 当全局变量和局部的变量如果冲突了,在局部作用域使用的是局部的变量, // 在全局里面使用的全局变量 function f3(){ var a = 20 console.log(a,"++++++++") } f3() console.log(a,"--------------") /* 1 全局的用起来比较方便 只需要定义一次,全局变量不会被释放,一直占用内存空间 2 局部的变量不能在函数体使用,当函数体执行完了,局部的变量就会直接被释放, */ //在局部定义变量如何间接使用在全局里面 function f4(e,f){ var d = 100 // 局部 return d } var f = f4() console.log(f)
作用域链
访问一个变量,按照作用域链进行访问,当访问一个变量,先当前作用域去找,如果找到了,就直接使用,如果没找到,去父级作用域去找,如果父级作用域没有,去他父级的父级作用域去找,直到找到全局作用域为止,这样就形成一个作用域链
var a = 100
function f2() {
var a = 30
function f3() {
var a = 20
function f4() {
var a = 10
console.log(a, "++++++") //10
}
f4()
console.log(a, "-------") //20
}
f3()
console.log(a, "????????") // 30
}
f2()
console.log(a) //100