JS如何给函数一个纯净的作用域?

作者站长头像
站长
· 阅读数 16

如题:假设我这边需要执行一个系统外传入的函数,但又害怕函数访问到系统内的变量导致随意更改。如何让函数访问不到内部的变量?(只访问到指定的,系统传入的变量)如:

var a = 1
var actions = {
  getA(){
      return a
  }
}
// eval中运行的就是系统外传入的函数
// 如何让它能访问到actions,而访问不到a?
// eval只是演示,能实现效果就行
eval('function(){alert(a)}')

10:26补充可以用Function方式,运行动态函数。各方面都挺符合的,但是访问指定变量需要用this。补充:用Function照样还是可以访问全局作用域的....

new Function('console.log(this)').apply({a:1})

访问a需要用this,有没有可以不用this直接使用a的方式?

回复
1个回答
avatar
test
2024-07-17

这里使用 eval 能访问到 a 和 actions 的原因其实很简单:

  1. eval 会共享作用域,即 eval 执行的代码也能访问到 eval 调用时所在的作用域。
  2. 因此, 要解决这个问题只要将 a 从 eval 执行 时的作用域中隔离出去即可

可以参考如下方式

// actions.js
let a = 1;

export default {
  getA(){
      return a
  }
}
// main.js
import actions from './actions.js';

eval('function(){alert(a)}')

另外 new Function 的方式其实是支持传参数的

const a = 1;
new Function('a', 'console.log(a)')(a);
回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容