JS:如何让函数捕获变量值而非变量引用以得到不同结果
问题描述
我写了一段简易代码,原本希望两个函数返回不同结果,但因为全局变量precision是以引用形式被调用的,最终两个函数得到了相同的结果:
precision = 4 func = (value) => value.toFixed(precision) precision = 2 func2 = (value) => value.toFixed(precision) console.log(func(2.3333)) // 输出2.33而非预期的2.3333 console.log(func2(2.3333)) // 输出2.33
请问如何让函数使用定义时precision的变量值而非变量本身,使两个函数返回不同结果?
解决方法
可以通过以下几种方式让函数捕获定义时的precision值,而非引用全局变量:
方法1:利用闭包创建工厂函数
写一个生成处理函数的工厂函数,每次传入指定的精度值,让返回的函数绑定该值:
function createFormatter(precision) { return (value) => value.toFixed(precision) } const func = createFormatter(4) const func2 = createFormatter(2) console.log(func(2.3333)) // 2.3333 console.log(func2(2.3333)) // 2.33
方法2:用函数默认参数捕获当前值
在定义箭头函数时,把precision作为默认参数传入,这样函数会保存定义时的数值:
let precision = 4 const func = (value, p = precision) => value.toFixed(p) precision = 2 const func2 = (value, p = precision) => value.toFixed(p) console.log(func(2.3333)) // 2.3333 console.log(func2(2.3333)) // 2.33
方法3:立即执行函数表达式(IIFE)
通过立即执行函数把当前的precision值封装到函数的作用域里:
let precision = 4 const func = ((p) => (value) => value.toFixed(p))(precision) precision = 2 const func2 = ((p) => (value) => value.toFixed(p))(precision) console.log(func(2.3333)) // 2.3333 console.log(func2(2.3333)) // 2.33
内容的提问来源于stack exchange,提问作者Suy
相关产品推荐
相关产品推荐

