su37josephxia / frontend-interview

前端面试知识点
MIT License
159 stars 45 forks source link

什么叫做副作用 #138

Open su37josephxia opened 2 years ago

shangjunhao commented 2 years ago

字面意思: 除了其本身的功能外, 还有其他的作用效果

纯函数

在 JS 函数中, 有一种函数叫做纯函数, 它便是一种无副作用的函数,

在输入相同的情况下, 返回的结果也相同. 它即不受外界的环境影响结果, 也不影响外界的环境.

引用透明

除了纯函数外, 引用透明也与副作用的概念相关, 引用透明表示两个相同的表达式/函数可以在程序的任意位置互相替换而不影响结果

它的优点是相比与非引用透明的语言更易理解, 以下代码中, 若 fun 函数无副作用, 则 res1 与 res2 相等, 即替换 fun(a) 并不影响程序的结果

let res1 = (fun(a) + b ) / (fun(a) - c)
let aa = fun(a)
let res2 = (aa + b) / (aa - c)

规范

我们一般从以下几点保证函数无副作用

1、函数入口使用参数, 但并不修改参数 2、函数内部不得改变函数外部的变量 3、运算的结果通过函数返回给外部

zcma11 commented 2 years ago

副作用是函数执行的时候对某些值进行修改,可能导致使用到该值的函数会得到不同的执行结果。也包括给对象挂新的属性。

比如

let a = 1
function add(x) {
  return x * a++
}

// 或者
let arr = [1,33,5,7,3,4,2]
function foo(arr) {
  return arr.sort((a, b) => a - b)
}

function bar(arr) {
  return arr.slice(0, 3)
}

// 或者
const obj = {}
function zoo(obj) {
  obj.a = 1
}

function woo(obj) {
  if (typeof obj.a === 'number') {
    return obj.a + 1
  }
  return 0
}