随手笔记(5)函数

函数函数

函数 将返回执行的代码封装成方法
函数,形参
函数组成,函数名 参数 函数体
函数名具有唯一性、
参数分为 形参,实参
函数体作用,完成该函数的功能
函数定义 function
-----》函数体中代码不会被执行平
函数执行 函数名字()
----》 函数执行后 就会执行函数体中的代码块
y=x+n 求任意两个数的和
function 定义一个函数 函数名字叫sum
函数执行语法,函数名字() ()执行符 函数表达式不一定有结果
函数参数
参数分为,形参和实参
形参本质定义变量形参可定义多个
形参作用,接受实参传入的值
实参,在函数执行时 传入的值
实参作用,当形参接受到实参后,会供给方法体使用完成功能 并输出结果
实参的位置,与形参的位置 一一对应的
实参个数<=形参个数
函数返回值
return 作用 函数的返回值
return 结束语句 return一下代码一律不执行
return 不是必须存在的,按需存在
立即执行函数
当变量名与函数名字重复时候,变量名在使用时 变量优先于函数
原理,函数编译的过程比变量复杂
立即执行函数
立即执行函数优点,防止函数内部变量被为污染(改变变量值)
立即执行函数与普通函数区别
普通函数有定义,按需执行 函数的变量可能会被污染
立即执行函数只有定义,直接执行
函数作用域
函数作用域为局部作用域
函数作用域,在函数声明的时候就形成了
函数内部的变量不会被函数外部访问
函数内部可以访问全局的变量
在函数中 var 声明的变量为局部的
如果没有var 为全局的
使用变量的规则
1.先在自己的作用域中找 ——》有直接使用 无看2
2.再去父域中找---->有使用 无看3
3.继续往上层域中找 直到全局域位置—》有用无 报错 — xxx is not define
省略var 存在的变量规则
例如,在最小域中【省略var】变量
1.在自己的域中找,看是否有 var xxx变量 或者形参是否xxx
----- 有 则是var xxx的重新赋值 或者形参为xxx 变量是局部的
----- 无 则会 向上一层父域中找 看是否var xxx 或者 形参为xxx 直到到达全局域为止
一直都无 var xxx 则为全局变量默认省略var
注意 函数中形参省略var 是局部的 一定不是全局的
数组封装
需要,封装数组去重方法
1,根据需求中变量可以找到形参
2.假设形参接受实参,如果处理实参
3.将固定的值变为不固定的值(形参) 方法封装
回调函数
js是同步的语言 执行顺序是冲上往下的
回调函数是异步的。
代码的执行顺序分为:同步,异步
同步 弊端:会发生执行阻塞、
异步不会发生阻塞
异步:未来某一时刻需要执行的代码,优先执行,同步是按照代码的编写顺序从上往下执行
js中异步
回调函数(ES5) promise对象(ES6) async await(ES7)
回调函数
优点:异步处理程序
缺点:容易形成毁掉地狱,代码让人看不懂
promise对象解决【回调地狱】问题 弊端 .then .then链式结构很恶心
推荐,async await 【同步写法异步程序,离不开promise 因为await会后必须是promise对
回调函数,一个定义的函数 作为另一个函数的实参传入到另一个函数中
回调函数执行
自动执行 针对一些内置的apl自动触发例如sort
手动执行 自定义的函数传入的回调函数需要我们自己写xxx()触发
回调函数学习注意事项
1:将来看到代码,【形参名字()】 ----> 该形参接受实参为【函数】—回调函数
2:注意形参的名字与实参的名字不是一个, 相当于将 实参【函数名】重新赋值给【形参cal
3:第一步首先要知道 形参接受的是【哪个函数】—>才能知道执行了哪个回调函数
------> 方式一:通过找到实参,找到形参接受的函数
------> 方式二:通过方法体打印形参,知道接受的是哪个函数;—>知道触发是哪个函
4:回调函数在执行时候,也可以传入实参,按照上面的顺序,找实参找函数/变量,看至执
5:不要纠结执行顺序问题,只要会找传入的函数就可以了。
异步学习方法
.异步是什么时候开始的
.异步执行完毕时候,是如何告诉外界的
.外界接收到信号后做什么
当函数作为实参传入时----》决定了【异步程序】
当回到函数执行时候----》【异步开始了】
当回调函数方法体代码执行完毕或者有【返回值】时—》异步执行完毕
外界只要接收到【返回结果】或者执行完毕效果—》【外界已经找到异步执行完毕】
异步执行完毕后,外界开始处理其他业务
arguments
arguments 是一个伪数组
arguments 是所有非箭头函数内部的一个局部变量 是一个伪数组 将所有的实参 放到伪数组中
arguments 具有索引值与长度但是数据的内置apl例如splice
展开符
… 展开符
1.如果展开数组[…被展开的数组名字]
2.如果展开对象{…被展开对象的名字}
变量提升
变量提升在各自的作用域中所声明的变量都会提升到作用域最顶端
提升,声明提升,赋值不提升 ---- 》已定义未赋值
变量使用及作用域问题
1.看表达式中变量在[自己的作用域]是否[声明] 只要自己的作用域有var变量不论在哪里都可以
------->有声明那么该变量就会提升到当前作用域最顶端
------->再看 使用变量时 是否有【赋值】
------->有 则用该值 无用undefined
------->没有声明 就去当前域的父域中找 直到全局域为止
-------> 无声明报错 xxx is not define
-------> 有 声明—>变量提升到作用域的顶部—> 再看是否赋值—>无【用undefined】有就会对应的值
总结,一看是否声明 二看是否赋值 用变量提升作用域
this
this指向的是对象
学习目标,看代码找到指向那个对象 如何应用它
函数中this 谁调用就指向谁
在事件函数中this 谁触发事件 this就指向谁
this 只能指向对象 不能指向对象
构造函数中的this 指向 指向构造函数
this指向
1.全局下的this指向window
2.函数中的this 谁调用指向谁
3.事件处理函数中 this 谁触发指向谁
4.对象中的this 默认指向当前对象
5.箭头函数中无this 但是如果箭头函数中出现this如何解决
6.构造函数中的this 指向构造的对象
区分this 使用时指向问题?
第一步,看this在哪里

  • 全局 this 指window
  • 函数中
    第二步,区分在什么函数中?
  • 箭头函数中,this 是 找上层作用域的this 【自己没有】
    • 上层作用域为全局 ---->window
    • 上层域为function函数---->按照下面步骤走
  • function 函数:
  • 事件处理函数,this 指向 触发事件对象
  • 构造函数 this 指向 构造函数创建的对象
  • 其他
    第三步,看函数后是否有 bind()call()apply()使用谁调用就指向谁规则
  • 有 以上三个函数 参一 是什么 this 指向参一对象
  • 无 ----> 使用谁调用就指向谁 规则
  • 注意 this.xx = xxx 是重新赋值,还是添加属性
    bind call apply 区别
    1.相同点,都是函数对象中属性 改变函数中this指向
    2.不同点
  • bind()方法 返回被改变this的函数 手动执行函数(bind的返回值)
  • call() apply() 无返回值 自动触发函数
  • call() apply() 区别:apply有两个参数,参二是数组 call有N个参数
    3.call 和 apply 除第一个参数以外其他参数都是给.左边函数传的实参
    4.语法 method.apply() method.call() methon.binf()()

你可能感兴趣的:(随手笔记(5)函数)