Javascript - 将对象属性转换为函数范围内的变量

Posted

技术标签:

【中文标题】Javascript - 将对象属性转换为函数范围内的变量【英文标题】:Javascript - Convert object properties to variables inside function scope [duplicate] 【发布时间】: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() 还要多)。我只是在寻找最佳选择。 【参考方案1】:

除了使用窗口对象之外,您还可以选择使用eval

let scope =  property: "value" 
function fun(scope)

  for (let p in scope)
  
    if (scope.hasOwnProperty(p))
      eval("var " + p + " = scope[p];");
  
  console.log(property);

fun(scope);

另见:How do i declare and use dynamic variables in javascript?

【讨论】:

以上是关于Javascript - 将对象属性转换为函数范围内的变量的主要内容,如果未能解决你的问题,请参考以下文章

javaScript使用技巧

如何将JavaScript日期转换为UTC?

将 QJsonObject 转换为 Javascript 对象

javascript如何将一个字符串转换为一个对象?

JavaScript中的parseInt和Number函数

JavaScript 将base64 转换为File