js -- 函数总结篇,函数提升、动态参数、剩余参数、箭头函数、this指向......

简介: js -- 函数总结篇,函数提升、动态参数、剩余参数、箭头函数、this指向......

一、函数提升

函数提升与变量提升比较类似,是指函数在声明之前即可被调用

  
  <script>
    // 调用函数
    foo()
    // 声明函数
    function foo() {
      console.log('声明之前即被调用...')
    }
    // 不存在提升现象
    bar()  // 错误
    var bar = function () {
      console.log('函数表达式不存在提升现象...')
    }
  </script>

总结:

  1. 函数提升能够使函数的声明调用更灵活
  2. 函数表达式不存在提升的现象
  3. 函数提升出现在相同作用域当中

二、函数参数

了解函数参数的使用细节,比如参数默认值、动态参数、剩余参数等等,能够提升函数应用的灵活度。

1.1 默认值

  
  <script>
    // 设置参数默认值
    function sayHi(name="小明", age=18) {
      document.write(`<p>大家好,我叫${name},我今年${age}岁了。</p>`);
    }
    // 调用函数
    sayHi();
    sayHi('小红');
    sayHi('小刚', 21);
  </script>

1.2 总结

  1. 声明函数时为形参赋值即为参数的默认值
  2. 如果参数未自定义默认值时,参数的默认值为 undefined
  3. 调用函数时没有传入对应实参时,参数的默认值被当做实参传入

2.1 动态参数

如果不确定函数调用时传参的数量,则适合用动态参数 👉 arguments 是函数内部内置的伪数组变量,它包含了调用函数时传入的所有实参。

  <script>
    // 求生函数,计算所有参数的和
    function sum() {
      // console.log(arguments)
      let s = 0
      for(let i = 0; i < arguments.length; i++) {
        s += arguments[i]
      }
      console.log(s)
    }
    // 调用求和函数
    sum(5, 10)// 两个参数
    sum(1, 2, 4) // 两个参数
  </script>

2.2 总结

  1. arguments 是一个伪数组
  2. arguments 的作用是动态获取函数的实参

3.1 剩余参数

函数调用时将部分传参或者全部传参合并到一个数组中,以...other来表示

  
  <script>
    function config(baseURL, ...other) {
      console.log(baseURL) // 得到 'http://baidu.com'
      console.log(other)  // other  得到 ['get', 'json']
    }
    // 调用函数
    config('http://baidu.com', 'get', 'json');
  </script>

3.3 总结

  1. ... 是语法符号,置于最末函数形参之前,用于获取多余的实参
  2. 借助 ... 获取的剩余实参,是个真数组

三、箭头函数

箭头函数是一种声明函数的简洁语法,它与普通函数并无本质的区别,差异性更多体现在语法格式上。

以下示例代码,包含了箭头函数的基本写法只有一个形参的简化写法,只有一行代码的简化写法、省略return直接返回对象的特殊写法

 
  <body>
    <script>
      //普通函数表达式的写法
      // const fn = function () {
      //   console.log(123)
      // }
      //fn()
 
      // 1. 箭头函数表达式 基本语法
      // const fn = () => {
      //   console.log(123)
      // }
      // fn()
      // const fn = (x) => {
      //   console.log(x)
      // }
      // fn(1)
 
 
      // 2. 只有一个形参的时候,可以省略小括号
      // const fn = x => {
      //   console.log(x)
      // }
      // fn(1)
 
 
      // // 3. 只有一行代码的时候,我们可以省略大括号
      // const fn = x => console.log(x)
      // fn(1)
 
 
      // 4. 只有一行代码的时候,可以省略return
      // const fn = x => x + x
      // console.log(fn(1)) 打印2
 
 
      // 5. 箭头函数可以直接返回一个对象
      // const fn = (uname) => ({ uname: uname })
      // console.log(fn('刘德华'))   打印{ uname: '刘德华'}
  
    </script>
  </body>

小结

  1. 箭头函数属于表达式函数,因此不存在函数提升
  2. 箭头函数只有一个参数时可以省略圆括号 ()
  3. 箭头函数函数体只有一行代码时可以省略花括号 {},并自动做为返回值被返回

箭头函数参数

箭头函数中没有 arguments,只能使用 ... 动态获取实参

  
  <body>
    <script>
      // 1. 利用箭头函数来求和
      const getSum = (...arr) => {
        let sum = 0
        for (let i = 0; i < arr.length; i++) {
          sum += arr[i]
        }
        return sum
      }
      const result = getSum(2, 3, 4)
      console.log(result) // 9
    </script>

四、箭头函数 this

1.普通函数的this指向

以前普通函数this的指向: 谁调用的这个函数,this 就指向谁

console.log(this) // window  
 
function fn() {   
  console.log(this) // window   
}    
window.fn()   
 
// 对象方法里面的this  
 const obj = {   
    name: 'andy',    
    sayHi: function () {  
      console.log(this)  // obj
    }  
 }   
 obj.sayHi()

2.箭头函数的this指向

箭头函数不会创建自己的this,它只会从自己的作用域链的上一层沿用this

<script>
      
      // 箭头函数的this  是上一层作用域的this 指向
      // const fn = () => {
      //   console.log(this)  // window
      // }
      // fn()
 
      // 对象方法箭头函数 this
      // const obj = {
      //   uname: 'pink老师',
      //   sayHi: () => {
      //     console.log(this)  // this 指向谁?---> window
      //   }
      // }
      // obj.sayHi()
 
  
      const obj = {
        uname: 'pink老师',
        sayHi: function () {
          console.log(this)  // obj
          let i = 10
          const count = () => {
            console.log(this)  // obj 
          }
          count()
        }
      }
      obj.sayHi()
  
    </script>
相关文章
|
15小时前
|
前端开发 JavaScript 程序员
探索JavaScript宝库:打开基础知识与实用技能之门(数据类型与变量+ 条件与循环+函数与模块+DOM+异常+ES6)
探索JavaScript宝库:打开基础知识与实用技能之门(数据类型与变量+ 条件与循环+函数与模块+DOM+异常+ES6)
2 0
|
1天前
|
JavaScript 前端开发
JavaScript作用域关乎变量和函数的可见范围。
【6月更文挑战第27天】JavaScript作用域关乎变量和函数的可见范围。全局作用域适用于整个脚本,局部作用域限于函数内部,而ES6引入的`let`和`const`实现了块级作用域。全局变量易引发冲突和内存占用,局部作用域在函数执行后消失,块级作用域提高了变量管理的灵活性。作用域关键在于组织代码和管理变量生命周期。
13 1
|
1天前
|
JavaScript
fastadmin js里获取后端传的参数
fastadmin js里获取后端传的参数
2 0
|
3天前
|
自然语言处理 前端开发 JavaScript
JavaScript 函数指南:掌握编程密钥库的精髓
JavaScript 函数指南:掌握编程密钥库的精髓
|
3天前
|
前端开发 JavaScript 安全
解锁 JavaScript ES6:函数与对象的高级扩展功能
解锁 JavaScript ES6:函数与对象的高级扩展功能
|
3天前
|
存储 JavaScript 前端开发
JavaScript——JavaScript基础:数组 | JavaScript函数:使用、作用域、函数表达式、预解析
在JavaScript中,内嵌函数可以访问定义在外层函数中的所有变量和函数,并包括其外层函数能访问的所有变量和函数。①全局变量:不在任何函数内声明的变量(显式定义)或在函数内省略var声明的变量(隐式定义)都称为全局变量,它在同一个页面文件中的所有脚本内都可以使用。函数表达式与函数声明的定义方式几乎相同,不同的是函数表达式的定义必须在调用前,而函数声明的方式则不限制声明与调用的顺序。③块级变量:ES 6提供的let关键字声明的变量称为块级变量,仅在“{}”中间有效,如if、for或while语句等。
20 0
|
3天前
|
自然语言处理 JavaScript 前端开发
JavaScript闭包是函数访问外部作用域变量的能力体现,它用于封装私有变量、持久化状态、避免全局污染和处理异步操作。
【6月更文挑战第25天】JavaScript闭包是函数访问外部作用域变量的能力体现,它用于封装私有变量、持久化状态、避免全局污染和处理异步操作。闭包基于作用域链和垃圾回收机制,允许函数记住其定义时的环境。例如,`createCounter`函数返回的内部函数能访问并更新`count`,每次调用`counter()`计数器递增,展示了闭包维持状态的特性。
18 5
|
3天前
|
存储 JavaScript 前端开发
JavaScript中的对象是数据结构,存储键值对,键为字符串,值可为任意类型,包括函数(作为方法)
【6月更文挑战第25天】JavaScript中的对象是数据结构,存储键值对,键为字符串,值可为任意类型,包括函数(作为方法)。
10 2
|
3天前
|
JavaScript 前端开发
JavaScript函数核心概念:用于代码复用与管理。
【6月更文挑战第25天】JavaScript函数核心概念:用于代码复用与管理。示例包括定义(无参、有参、有返回值)与调用,参数按值传递。函数内修改参数不影响外部变量。
8 1
|
5天前
|
JavaScript
JS获取浏览器地址栏的多个参数值的任意值
JS获取浏览器地址栏的多个参数值的任意值
15 3