【问题标题】:Hijack scope chain reference to var劫持作用域链对 var 的引用
【发布时间】:2017-02-23 18:19:48
【问题描述】:

如何覆盖/劫持作用域链中的引用?

如果我在另一个文件(节点环境)中有一个函数:

const name = 'name_local'
export default () => { return name }

我想从另一个文件导入该函数,但覆盖它对name 的引用并传递一个新引用:

import nameFunc from '../otherFile'
const name = 'hijacked name reference'
nameFunc() // 'hijacked name reference'

【问题讨论】:

  • 没有。这是不好的。这个的预期用途是什么?
  • 为什么不使用默认参数export default (name = name) => { return name },然后在你的其他文件中调用nameFunc(name)
  • 好吧,首先你试图覆盖一个常量......

标签: javascript


【解决方案1】:

你不能,该语言没有为你提供这样做的机制。

那句话看似微不足道,但事实就是如此:语言不允许你。在规范方面,尽管函数可以访问其封闭的词法环境记录,该记录具有name 的绑定,但该引用(实际上是一般的词法环境记录)不会暴露给脚本代码(并且不允许甚至实际上存在于实现中;它们是一种规范机制)。因此无法从函数中获取该信息,因此无法更改它。

【讨论】:

  • ...幸运的是。 :-)
  • @guest271314:这样做将完全取代该功能。如果它使用了您不替换的源上下文中的任何内容,则该函数会中断。如果没有(你替换所有东西),那就没有意义了:只需使用你自己的函数。
  • @guest271314:是的,在我看来,出于上述原因。
  • 谢谢大家-我理解这也会暴露语言的安全含义:-|我正在为一个库编写单元测试,但建议不要更改任何源代码,同时实现 100% 的覆盖率 :-( 正在寻找一个小的解决方法,如果可能的话
  • @CoryRobinson:哈哈,很好的要求。 :-)
【解决方案2】:

就这样做吧:

const name = 'name_local';
export default (input = name) => { return input }

其他文件:

import nameFunc from '../otherFile'
const name = 'name_other';
nameFunc(name)

【讨论】:

  • Thx - 不是我的应用程序的解决方案,虽然是一个简单的答案。我正在接近我无权更改函数签名的代码,即:添加一个带默认值的参数。
猜你喜欢
  • 1970-01-01
  • 2018-04-03
  • 2013-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-09
  • 2014-10-01
  • 1970-01-01
相关资源
最近更新 更多