【发布时间】:2017-09-30 22:19:46
【问题描述】:
这就是我想要实现的目标:
let scope = { property: "value" };
function fun()
{
//That's how I can get my variables:
console.log(this.property);
//And that's how I want to get them
console.log(property);
}
fun.call(scope);
当然,bind() 函数不是这样工作的。我的想法是这样做:
let scope = { property: "value" }
function fun(scope)
{
for (let p in scope)
{
if (scope.hasOwnProperty(p))
window[p] = scope[p];
}
// Now it works
console.log(property);
}
fun(scope);
不幸的是,通过这样做,变量被声明在全局范围内,垃圾收集器不会在函数执行后释放它们。因此,我还必须在函数末尾添加类似这样的内容:
for (let p in scope)
{
if (scope.hasOwnProperty(p))
delete window[p];
}
但是我们都知道删除操作符很重,所以我想省略使用它。 这就是为什么我正在寻找一种将对象属性转换为函数范围内的变量的方法。
PS:我不能使用解构赋值,因为我不知道对象属性的名称。
【问题讨论】:
-
在这种情况下担心 GC 或“内存使用”是愚蠢的,因为赋值 不会创建新对象。因此,唯一“浪费”的对象是包含将被复制到 和 上的值的对象,这假设没有执行积极的优化。 (“浪费”是一个很小的值,即使提到“浪费”的可能性也是不正确、有偏见和误导)。
-
如果你不知道对象属性的名称,你会如何使用它们作为变量名?!
-
@user2864740 这个函数会被许多不同的对象多次调用。如果我不使用删除运算符属性将填充我的全局范围(内存泄漏的种类)。如果我使用它,操作将花费很多时间(甚至比 eval() 还要多)。我只是在寻找最佳选择。
标签: javascript variables object properties scope