js不会检查任何参数类型,任何参数都可以作为参数传递
1、对象参数
改变量随便改,改对象要看这个对象是不是有多个变量同时指向这个对象
const 用来定义常量,只能赋值一次。
变量------->对象------->属性
被const修饰的对象 不能改 可以改
使用对象作为参数
设置默认对象的参数,定义以对象为参数的函数
第一种情况,不传参数调用函数
function fn2(a={name:"沙和尚"}){
console.log("a=", a)
a.name = "唐僧"
console.log("a=",a)
}
fn2()
fn2()
结果:
说明无参数调用时候,每次调用都会创建一个对象
第二种传已有的对象作为参数
let obj = {name:"孙悟空"}
function fn2(a={name:"沙和尚"}){
console.log("a=", a)
a.name = "唐僧"
console.log("a=",a)
}
fn2(obj)
fn2(obj)
结果:
说明传现有对象进去时候,不会再创建新的对象
2、函数参数
因为万物皆是对象,函数也是。既然函数能传对象参数,那么也能传函数参数
所以
const a= (b) => {
console.log("b=",b)
}
const c= () => {
console.log("我是c函数")
}
a(c)
结果:
相当于我们把函数作为参数传递到了a函数里,如果不清晰,我们也可以把打印语句换成调用作为参数的函数
const a= (b) => {
// console.log("b=",b)
b()
}
const c= () => {
console.log("我是c函数")
}
a(c)
结果:(可以看到c函数被a调用了)
复习箭头函数:
形式:()=> {}
函数表达式形式:const a = () => {}
箭头函数的参数当且仅当只有一个参数时候,可以省略括号(不推荐,知道即可)
箭头函数的代码块里如果只有一条语句的时候,可以省略大括号(不推荐,了解即可)
函数返回值小小说一下,因为js没有类型,所以直接在函数里面return
并且注意:在JS中任何值都可以作为返回值使用(包括对象和函数之类)
如果return后面不跟任何值,则相当于返回undefined
如果不写return,函数的返回值依然是undefined
return一旦执行,函数立即结束(这个不用说hh)
const a=()=>{
return "hello"
}
let b = a()
console.log(b)
结果:
因为箭头函数的返回值可以直接写在箭头后面,所以我们可以继续简化
const a=()=>"hello"
let b = a()
console.log(b)
结果是一样的:
但是这种省略会出现问题,当希望返回的是对象的时候,对象定义的外面两个大括号会被识别为定义函数的大括号从而被识别为普通函数的代码块,如:
const a=()=> {name:"这是一个对象"}
let b = a()
console.log(b)
结果是undefined:
那要怎么解决呢,我们再对象外面再加一对圆括号就可以了
const a=()=> ({name:"这是一个对象"})
let b = a()
console.log(b)
结果:
3、作用域(变量的可见区域)
作用域有两种:
1、全局作用域
-全局作用域在网页运行时候创建,在网页关闭时消耗
-所有直接编写到script标签中的代码都位于全局作用域中
-全局作用域中的变量是全局变量,可以在任意位置访问
2、局部作用域
- 块作用域
-块作用域是一种局部作用域
-块作用域在代码块执行时创建,代码块执行完毕它销毁
-在块作用域中声明的变量是局部变量,只能在块内访问,外部无法访问。
作用域链:
-当我们使用一个变量时,
JS解释器会优先在当前作用域中寻找变量,
如果找到了则直接使用
如果没找到,则去上一级作用域中寻找,找到了则使用
如果没找到,则继续去上一级寻找,以此类推
如果一直到全局作用域都没找到,则报错 xxx is not defined
var用来声明变量,作用和let相同,但是var不具有块作用域
-在全局中使用var声明的变量,都会作为window对象的属性保存
-使用function声明的函数,都会作为window的额方法保存
-使用let声明的变量不会存储在window,而存在一个地方
在局部作用域中(如函数中)没有用var或let声明属性,那么它会自动成为window的属性,也就是全局变量
在开发中尽量减少直接在全局作用域中编写代码(如果是多人开放,就会导致覆盖问题)
立即执行函数(IIFE)
-立即执行函数是一个匿名的函数,并且它只会调用一次
-可以利用IIFE来创建一个一次性的函数作用域,避免变量冲突的问题
(function(){
let a =10
console.log(111)
}())
注意当两个立即执行函数连在一起时候,系统会识别为(xx)(xx)函数的形式,会报错,所以我们最好在出现这种情况时手动加分号,分隔开
4、函数中的this
this
-函数在执行时,JS解析器每次都会传进一个隐含的参数
-这个隐含的参数叫做 this
-this会指向一个对象,
-this所指的对象会根据函数调用方式的不同而不同
1、以函数的形式调用时,this指向的是window
2、以方法的形式调用时,this指向的是调用方法的对象
箭头函数:
([参数])=>返回值
例子:
无箭头函数:()=>返回值
一个参数的:a =>返回值
多个参数的:(a,b)=>返回值
只有一个语句的函数:()=>返回值
只返回一个对象的值:()=> ({...})
有多行语句的函数:()=> {
.......
return 返回值
}
箭头函数没有自己的this,它的this由外层作用域决定
箭头函数的this和它的调用方式无关
箭头函数的
待更新。。