给出一个简单的功能:
const a = (x) => (y) => x + y
及其部分应用的版本:
const b = a(3)
是否可以更改b
中已经绑定的参数?像
b.boundArgs[0] = 5
因此,如果我致电b(5)
,它将返回10
而不是8
背景知识:
我使用一个库,该库由于其中一个库函数调用而返回部分应用的函数。
我必须修改第一个参数(由库函数应用),并且我不想复制粘贴此函数的实现。除了这个小小的修改,我想留在图书馆。
答案 0 :(得分:2)
不,除非有问题的库允许这样做,否则您无法这样做。可以,但是可能不会。
基本上,您要问的是您是否可以进入执行上下文并关闭函数并在该上下文中更改变量值(更准确地说,是 bindings )。默认情况下不能。使用更详细的示例:
const a = (x) => {
const b = (y) => x + y;
return b;
};
默认情况下,b
不能执行任何操作,让您可以在x
关闭的环境中进入并更改b
。
我早些时候说过,图书馆可以让你做到这一点,但可能没有。这是它可以做到的一种方法:
const a = (x) => {
const b = (y) => x + y;
b.changeX = (newX) => {
x = newX;
};
return b;
};
const b = a(3);
b.changeX(10);
console.log(b(5)); // 15 instead of 8
您仍然找不到x
绑定到b
的内容,但是可以通过changeX
进行更改。
或者libray可以在返回的函数上使用属性:
const a = (x) => {
const b = (y) => b.x + y; // Note b.x
b.x = x; // Initial value
return b;
};
const b = a(3);
b.x = 10;
console.log(b(5)); // 15 instead of 8
我绝不暗示这是一个好主意,封装通常起着重要的作用。只是指出可以做这种事情。