定义一个函数

  1. //具名函数
  2. function 函数名(参数1,参数2){
  3. 条件语句
  4. return 返回值
  5. }
  6. //匿名函数
  7. let a = function (参数1,参数2){
  8. return 返回值
  9. }//如果有函数名,那么函数名的作用域只在等号右边,函数要是没在等号右边而是单独存在那么函数名的作用域就是全局
  10. //箭头函数 (箭头函数的this就是一个普通的变量)
  11. let a = x => x*x
  12. let a = (x,y) =>{return x+y}//当有两个参数时,要加圆括号
  13. let a = (x,y) =>({'name':'chen'})//当返回值为对象时也要加圆括号
  14. //函数与函数调用
  15. let a = ()=>console.log('hi')
  16. a()//a()就是调用a变量定义的函数。有圆括号才是调用。

函数的要素

  1. 调用时机 ```javascript let a = 1 function fn(){ console.log(a) }//调用fn()返回值为1

let a = 1 function fn(){ setTimeout(()=>{console.log(a)},0) } fn(a) a = 2 //调用fn(),因为有定时器(setTimeout),所以要执行完其他代码在实行定时器,所以返回值为1 //如果没有定时器,函数内只有console.log则会返回1。

let i = 0 for( i = 0;i<6;i++){ setTimeout(()=>{ console.log(i) },0) } //结果是6个6。因为当i=6时不满足循环条件循环结束,所以一共有六次循环。 //因为setTimeout是等所有代码执行完了在执行,所以使得这六次循环返回值都为6。

for(let i = 0;i<6;i++){ setTimeout(()=>{ console.log(i) },0) }

  1. 2. 作用域与闭包
  2. ```javascript
  3. function f1(){
  4. let a = 1
  5. function f2(){
  6. let a = 2
  7. function f3(){
  8. console.log(a)
  9. }
  10. a = 22
  11. console.log(a)
  12. f3()
  13. }
  14. console.log(a)
  15. a = 100
  16. f2()
  17. }
  18. f1()
  19. /*当函数中定义一个变量时,其变量的作用域只在{}
  20. 上面示例得出返回值为1,2,22
  21. 1. 当f1()调用函数时,f1中的f2函数是一个整体,根据js的作用域规则f2内得a变量无法作用到f1上,
  22. 又因为在f1中先执行log,在执行a = 100,所以f1中log最终返回值为1。
  23. 2. 当f2()调用函数时,当执行log时,a已经为22,所以log最终返回a = 22。
  24. 3. 当f3()调用函数时,因为a中没有a变量,所以f3会找离它最近的a,即f2中的a,
  25. 由于f2作用域上的a得终等于22,所有f3()执行函数得出log为22.
  26. 何为闭包?闭包就是函数中得函数,内部的函数需要访问到外部函数的变量或者参数这就是闭包。
  27. */
  1. 形式参数

    • 形式参数的意思就是非实际参数
      1. function add(x,y)
      2. function addObject(x,y)
      3. //x和y只是代表形式参数,而非实际的参数,形式参数可认为就是变量声明。
  2. 返回值

    • 每个函数都有返回值,函数执行才有返回值,只有函数才有返回值。必须加return才有返回值。
  3. 调用栈
    • 定义:js引擎会在执行函数之前,需要把函数push到调用栈里,等函数执行完了再pop出来,return到原来的环境,在执行其他代码。
    • 递归函数(可以循环):当函数调用自己本身时,就为递归函数(函数内必须有运算)。
    • 函数提升:函数会自动跑到前面。
  4. argument和this

    • arguments和this每个函数都有,箭头函数除外。
    • arguments是伪数组。
    • this默认指向window,如果要给this传值,需要使用call进行传,如果穿的值不是对象,js会自动将传的值封装成对象。如果不加use strict r可能将要传的值变为对象

      1. ![image.png](https://cdn.nlark.com/yuque/0/2020/png/1314543/1589171527252-0f6fbe9f-e0bd-453a-8a74-01216eaa4f57.png#align=left&display=inline&height=244&margin=%5Bobject%20Object%5D&name=image.png&originHeight=731&originWidth=1057&size=458951&status=done&style=none&width=352.3333333333333)<br /> ![image.png](https://cdn.nlark.com/yuque/0/2020/png/1314543/1589171599349-ababa60c-0c28-4696-b162-2adb83d086b7.png#align=left&display=inline&height=249&margin=%5Bobject%20Object%5D&name=image.png&originHeight=746&originWidth=1132&size=425378&status=done&style=none&width=377.3333333333333)<br /> 根据上面两图,我们就需要一种办法拿到拿到需要引用的对象<br /> ![image.png](https://cdn.nlark.com/yuque/0/2020/png/1314543/1589171970508-372ed394-74af-4d12-8fbd-87e95602553d.png#align=left&display=inline&height=394&margin=%5Bobject%20Object%5D&name=image.png&originHeight=1181&originWidth=1835&size=1169824&status=done&style=none&width=612)

      ```javascript let a = function(){ name:’chen’; sayHi{ console.log(this.name) } } a.sayHi.call({name:1}) //返回1

let a = function(){ name:’chen’; sayHi{ console.log(this.name) } } a.sayHi.call(a) //返回chen ``` image.png
image.png