Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/453.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 劫持对var的作用域链引用_Javascript - Fatal编程技术网

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)