javascript - 如何在javascript中访问函数之外的数组
问题描述
我只是想知道如何解决这个奇怪的安全/范围问题:
function vector() {
var array = [];
return {
append: function append(v) {
array.push(v);
},
get: function get(i) {
return array[i];
},
store: function store(i,v) {
array[i] = v;
}
};
}
这是被问到的问题:
你能发现这种方法的任何安全问题吗?主要是,我们可以访问
array
外部vector
吗?注意*:该问题与原型无关,我们可以假设全局原型无法更改。提示*:考虑this
在方法调用中使用。我们可以覆盖向量的方法吗?
例子
var v = vector();
v.append(1);
v.append(2);
var internalData = exploitVector(v); // [1, 2]
我的尝试+想法
很确定我应该this
按照提示所说的方式使用关键字。我是 javascript 的初学者,所以我不太了解context
。此代码是在文本编辑器 Atom 上编写的具有其他功能的文件,而不是浏览器。
function exploitVector(v) {
v.get = function() {
return this.array;
};
console.log(v.get());
return v.get();
}
另外,这只是我在 github repo 上看到的一个有趣的练习。
解决方案
Vector.store()
可以滥用来修改数组方法(例如array.push
),后跟av.append()
来触发修改后的array.push
方法。例如,修改后的 push 方法可以执行类似的操作window.visiblearray=this
,之后可以全局访问 visiblearray。
或者如下例所示,将this
(Array 实例)存储到本地作用域的 visiblearray 中,然后返回。
function vector() {
var array = [];
return {
append: function append(v) {
array.push(v);
},
get: function get(i) {
return array[i];
},
store: function store(i,v) {
array[i] = v;
}
};
}
var v = vector();
v.append(1);
v.append(2);
var internalData = exploitVector(v); // [1, 2]
function exploitVector(v) {
var visible_array;
v.store('push', function(x){visible_array=this}) // modify array push
v.append(12) // trigger the modified array push
console.log(visible_array);
return visible_array
}
推荐阅读
- excel - 通过 VBA 更改度量后如何停止数据透视表重新计算
- javascript - 无法从“App.js”解析“react-navigation-stack”
- python - 检查不同文本文件中的相同列值?
- python - 矢量化自定义功能在熊猫中没有按预期工作
- java - 由于带有特殊字符 % 和 ; 的请求不正确 Spring Framework 抛出完整的股份跟踪,tomcat 在结果中显示完整的堆栈跟踪
- puppeteer - 如何使用 pyppeteer 下载 csv?
- python - ML 函数作为 pyspark UDF
- sql - PG::InvalidParameterValue: 错误: 无法从标量中提取元素
- python - SessionNotCreatedException:消息:无法在机器人框架中找到一组匹配的功能
- javascript - 从两个 HTML 文件访问 Forge 查看器