Javascript 劫持对var的作用域链引用
如何在范围链中重写/劫持引用 如果我在另一个文件(节点环境)中有一个函数: 我想从另一个文件导入该函数,但通过传递一个新引用来覆盖它对Javascript 劫持对var的作用域链引用,javascript,Javascript,如何在范围链中重写/劫持引用 如果我在另一个文件(节点环境)中有一个函数: 我想从另一个文件导入该函数,但通过传递一个新引用来覆盖它对name的引用: import nameFunc from '../otherFile' const name = 'hijacked name reference' nameFunc() // 'hijacked name reference' 你不能,语言没有为你提供这样做的机制 这一句话似乎很贫乏,但实际上就是这样:语言不允许你这样做。在规范术语中,尽管函
name
的引用:
import nameFunc from '../otherFile'
const name = 'hijacked name reference'
nameFunc() // 'hijacked name reference'
你不能,语言没有为你提供这样做的机制 这一句话似乎很贫乏,但实际上就是这样:语言不允许你这样做。在规范术语中,尽管函数可以访问其封闭的词法环境记录,该记录具有
名称
的绑定,但该引用(事实上,通常是词法环境记录)不会暴露于脚本代码中(甚至不允许在实现中存在;它们是一种规范机制)。因此,无法从函数中获取信息,也无法更改它。只需这样做:
const name = 'name_local';
export default (input = name) => { return input }
其他文件:
import nameFunc from '../otherFile'
const name = 'name_other';
nameFunc(name)
不,这很糟糕。这有什么用途?为什么不使用默认参数
export default(name=name)=>{return name}
,然后在另一个文件中调用nameFunc(name)
;好吧,首先,你试图覆盖一个常量……幸运的是::-)@guest271314:这样做将完全取代该功能。如果它使用源上下文中任何您不替换的内容,则函数将中断。如果不能(替换所有内容),就没有意义了:只使用自己的功能。@guest271314:是的,在我看来,出于上述原因。Thx everyone-我理解这也会暴露语言的安全含义:-我正在为库编写单元测试,但建议不要更改任何源代码,同时实现100%的覆盖率:-(正在寻找一个小的解决方法,如果可能的话)possible@CoryRobinson:LOL,不错的要求。:-)Thx-不是我的应用程序的解决方案,尽管答案很简单。我正在处理我无权更改函数签名的代码,即:添加带默认值的参数。
import nameFunc from '../otherFile'
const name = 'name_other';
nameFunc(name)