惰性函数(函数重写)

惰性函数的定义

  • 惰性函数表示函数执行的分支只会在函数第一次调用的时候执行,在第一次调用过程中,该函数会被覆盖为另一个按照合适方式执行的函数,这样任何对原函数的调用就不用再经过执行的分支了。
  • 惰性函数的本质就是函数重写,所谓惰性载入,指函数执行的分支只会发生一次。

下面用在不同浏览器复制文本的案例为例,看看使用惰性函数和没有使用惰性函数的区别。

没有使用惰性函数的写法

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <button onclick='copyText()'>复制文本</button>
  <input type="text">
</body>
<script>
  const inputText = document.querySelector('input')
  function copyText(){
    // 没有使用惰性函数,每次复制文本都会做一次判断
    if(navigator.clipboard){
      // 如果浏览器有clipboard API则直接在剪贴板中写入
      navigator.clipboard.writeText(inputText.value)
    }
    else{
      // 如果浏览器没有clipboard API(如IE浏览器)
      // 则创建一个input标签并复制相应文本后再销毁创建的input标签(等价于if判断的复制文本效果)
      inputText.setAttribute('value', inputText.value);
      document.body.appendChild(inputText)
      input.select()
      document.execCommand('copy')
      document.body.removeChild(input)
    }
  }
</script>
</html>

使用惰性函数的一般写法

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <button onclick='copyText()'>复制文本</button>
  <input type="text">
</body>
<script>
  const inputText = document.querySelector('input')
  function copyText(){
    // 没有使用惰性函数,每次复制文本都会做一次判断
    if(navigator.clipboard){
      // 直接重写copyText函数
      copyText = () => {
        // 如果浏览器有clipboard API则直接在剪贴板中写入
        navigator.clipboard.writeText(inputText.value)
      }
      // 第二次复制文本后copyText函数已被重写
      copyText()
    }
    else{
      // 直接重写copyText函数
      copyText = () => {
     	// 如果浏览器没有clipboard API(如IE浏览器)
        // 则创建一个input标签并复制相应文本后再销毁创建的input标签(等价于if判断的复制文本效果)
        inputText.setAttribute('value', inputText.value);
        document.body.appendChild(inputText)
        input.select()
        document.execCommand('copy')
        document.body.removeChild(input)
      }
      // 第二次复制文本后copyText函数已被重写
      copyText()
    }
  }
</script>
</html>

惰性函数的高阶函数写法

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <button onclick="copyText()">复制文本</button>
    <input type="text" />
  </body>
  <script>
    const inputText = document.querySelector('input')
    function createCopyText() {
      if (navigator.clipboard) {
        // 直接返回原本的copyText函数体
        return () => {
          navigator.clipboard.writeText(inputText.value)
        }
      } else {
        // 直接返回原本的copyText函数体
        return () => {
          inputText.setAttribute('value', inputText.value)
          document.body.appendChild(inputText)
          input.select()
          document.execCommand('copy')
          document.body.removeChild(input)
        }
      }
    }
    // 有需要的时候就调用createCopyText函数,可以重复使用
    // 相当于封装了copyText函数
    const copyText = createCopyText()
  </script>
</html>

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
函数式编程是一种编程范式,它将计算视为数学函数的求值过程。Python作为一门多范式的编程语言,也支持函数式编程。在函数式编程中,函数被视为一等公民,可以作为参数传递给其他函数,也可以作为返回值返回。函数式编程强调不可变性和无副作用,通过使用纯函数来实现。 在Python中,函数式编程可以通过以下几个特性来实现: 1. 高阶函数:Python中的函数可以作为参数传递给其他函数,也可以作为返回值返回。这使得我们可以使用高阶函数来实现函数的组合、柯里化等功能。 2. 匿名函数:Python中的lambda表达式允许我们创建匿名函数,这些函数可以在需要时直接定义,而不需要使用def关键字进行命名。 3. map、filter和reduce函数:这些内置函数函数式编程的重要工具。map函数可以将一个函数应用于一个可迭代对象的每个元素,并返回一个新的可迭代对象;filter函数根据指定的条件过滤可迭代对象中的元素,并返回一个新的可迭代对象;reduce函数对可迭代对象中的元素进行累积操作,返回一个单一的结果。 4. 列表推导式和生成器表达式:这些语法结构允许我们使用简洁的方式创建新的列表或生成器,从而实现对可迭代对象的转换或筛选。 5. 不可变性:函数式编程强调不可变性,即函数的参数和局部变量在函数执行期间不可修改。Python中的元组和frozenset等不可变对象可以用来实现这一特性。 6. 递归:函数式编程常常使用递归来解决问题,通过函数自身调用来实现循环和迭代的效果。 总结起来,Python的函数式编程提供了一系列工具和语法结构,使得我们可以更加方便地使用函数作为一等公民,并且实现函数的组合、柯里化、惰性求值等特性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伍嘉源

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值