使用循环重新声明在全局范围内定义的变量

Redeclare variables defined in global scope with a loop

我正在尝试重新声明在全局范围内定义的变量。我想包装每个函数

const {values, map, each} = require('lodash')

const wrapFnInLog = (fn) => (...input) => {
  console.log({name: fn.name, input})
  const possiblePromise = fn.apply(null, input)
  if (get(possiblePromise, 'then')) {
    return possiblePromise.then(output => {
      console.log({name: fn.name, output})
      return output
    })
  } else {
    console.log({name: fn.name, output: possiblePromise})
    return possiblePromise
  }
}

let a = (arr) => map(arr, i => i.name)
let b = (obj) => a(values(obj))

const provide = [a, b]

provide.forEach(fn => wrapFnInLog(fn))

const example = {
  personTom: {
    name: 'Tom'
  },
  personJerry: {
    name: 'Jerry'
  }
}

b(example)

我希望输出如下所示:

{ name: 'b', input: [ { personTom: [Object], personJerry: [Object] } ] }
{ name: 'a', input: [ [ [Object], [Object] ] ] }
{ name: 'a', output: [ 'Tom', 'Jerry' ] }
{ name: 'b', output: [ 'Tom', 'Jerry' ] }

我能够实现这一点的唯一方法是不使用循环,而是通过有意地一个一个地覆盖每个变量。

a = wrapFnInLog(a)
b = wrapFnInLog(b)

我想知道是否可以循环 [a, b] 并覆盖函数定义,同时将它们保留在全局模块范围内。

如前所述,您可以使用解构赋值一次分配多个变量

let a = (arr) => map(arr, i => i.name);
let b = (obj) => a(values(obj));

[a,b] = [a,b].map(wrapFnInLog);

但与解构赋值结合变量声明 (let [a,b] = ...) 不同,您必须小心在赋值之前编写的内容,并正确分隔命令。

因为自动插入分号,或者 JS 在应该插入分号的地方插入分号,

let a = (arr) => map(arr, i => i.name)
let b = (obj) => a(values(obj))

[a,b] = [a,b].map(wrapFnInLog)

将被解释为

let a = (arr) => map(arr, i => i.name);
let b = (obj) => {
  return a(values(obj))[a,b] = [a,b].map(wrapFnInLog);
}
//or in other words
let b = (obj) => {
  let tmp1 = a(values(obj));
  a; //the `a,` in something[a,b];
  let tmp2 = [a,b].map(wrapFnInLog);
  tmp1[b] = tmp2;
  return tmp2;
}