export function executeStrFunction (funcString, args) {
  // 使用 eval 执行传入的函数字符串
  // eslint-disable-next-line no-eval
  return eval(`(${funcString})`)(...args)
}

export function executeStrFunctionByContext (context, fnStr, args) {
  // 使用 new Function 创建函数，并绑定 context 作为 this
  // 必须用字符串拼接，不能用模板字符串，否则 fnStr 里的 ${...} 会被解释，破坏脚本
  const code = 'return (' + fnStr + ');'
  let fn
  try {
    // eslint-disable-next-line no-eval,no-new-func
    fn = new Function(code)()
  } catch (e) {
    // 报错时打出完整传入的脚本，便于排查
    const full = typeof fnStr === 'string' ? fnStr : String(fnStr)
    console.error('[runEvalFunction] new Function 报错，fnStr 长度:', full.length)
    console.error('[runEvalFunction] ========== 完整 fnStr 开始 ==========')
    console.error(full)
    console.error('[runEvalFunction] ========== 完整 fnStr 结束 ==========')
    throw e
  }
  return fn.bind(context)(...args)
}
