JS如何给函数一个纯净的作用域?
如题:假设我这边需要执行一个系统外传入的函数,但又害怕函数访问到系统内的变量导致随意更改。如何让函数访问不到内部的变量?(只访问到指定的,系统传入的变量)如:
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个回答

test
2024-07-17
这里使用 eval 能访问到 a 和 actions 的原因其实很简单:
- eval 会共享作用域,即 eval 执行的代码也能访问到 eval 调用时所在的作用域。
- 因此, 要解决这个问题只要将 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);
回复

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