无法将对象键作为局部变量传递给函数

JS_INF
  • 我正在尝试创建一个函数,该函数将使用对象中的选定元素声明变量,如下所示
var el = {
    'btn1': '#btn',
    'time1': '#time',
    'audio': 'audio',
    'elem': '.elem'
}
  • 该函数包含 2 个参数
    1. 第一个参数是针对对象的
    2. 第二个参数是一个函数,我想将变量传递给他
  • 我想将声明的变量作为局部变量传递给第二个参数
  • 我曾经new Function()将键作为变量名,然后将值分配给它们
  • 我试过apply()bind()将变量传递给函数

问题是

  • apply()bind()将变量设置为 window 对象以使其成为全局变量,我希望它们成为此函数的局部变量
  • 这是我的功能
function selectElements(obj, fn) {
  if (typeof fn === 'function') {
    for(var i in obj) {
        obj[i] = obj[i].replace(/^\#/, function(selectedElem) {
            selectedElem = obj[i].replace(/^\#/, '');
            new Function('return '+ fn+'.bind('+i+' = document.getElementById("'+selectedElem+'"))')()
        }).replace(/^\./, function(selectedElem) {
            selectedElem = obj[i].replace(/^\./, '');
            new Function('return '+ fn+'.bind('+i+' = document.getElementsByClassName("'+selectedElem+'"))')()
        }).replace(/^\w+/, function(selectedElem) {
            if (!selectedElem.startsWith('undefined')) {
                new Function('return '+ fn +'.bind('+i+' = document.getElementsByTagName("'+selectedElem+'"))')()
            }
        })
    }
  }
}
  • 另一个简单的例子,如果我做了以下操作也会将 x 设置为 window 对象
function selectElements(obj, fn) {
  fn.bind(x = 123)
}
  • 我想要的只是将带有选定元素的键作为变量传递给fnnot 到 window 对象

完整代码

var el = {
  'btn1': '#btn',
  'time1': '#time',
  'audio': 'audio',
  'elem': '.elem'
}

function selectElements(obj, fn) {
  var sel;
  if (typeof fn === 'function') {
    for (var i in obj) {
      obj[i] = obj[i].replace(/^\#/, function(selectedElem) {
        selectedElem = obj[i].replace(/^\#/, '');
        sel = ' = document.getElementById("' + selectedElem + '")'
        new Function('return ' + fn + '.bind(' + i + sel + ')')()
      }).replace(/^\./, function(selectedElem) {
        selectedElem = obj[i].replace(/^\./, '');
        sel = ' = document.getElementsByClassName("' + selectedElem + '")'
        new Function('return ' + fn + '.bind(' + i + sel + ')')()
      }).replace(/^\w+/, function(selectedElem) {
        if (!selectedElem.startsWith('undefined')) {
          sel = ' = document.getElementsByTagName("' + selectedElem + '")'
          new Function('return ' + fn + '.bind(' + i + sel + ')')()
        }
      })
    }
    fn()
  }
}
selectElements(el, function() {
  console.log(window)
  console.log(btn1, time1, audio, elem)
})
<div id="time"></div>
<audio controls src="audio.mp3" type="audio/mpeg"></audio>
<button id="btn">play</button>
<div class="elem">000</div>

瓦诺姆

我认为你能做到的唯一方法是在函数本身内并通过邪恶eval()......

var el = {
  'btn1': '#btn',
  'time1': '#time',
  'audio': 'audio',
  'elem': '.elem'
}

function selectElements(obj, fn) {
  if (typeof fn === 'function') {
    const that = {};
    for (let i in obj)
      that[i] = document["querySelector" + (obj[i][0] == "#" ? "" : "All")](obj[i]);

    return fn.bind(that)();
  }
}
selectElements(el, function() {
  for(let i in this)
  {
    let t = this[i];
    eval("var " + i + "=t");
  }
  console.log("global", window.btn1, window.time1, window.audio, window.elem);
  console.log("local", btn1, time1, audio, elem)
  console.log("this", this.btn1, this.time1, this.audio, this.elem)
})
<div id="time"></div>
<audio controls src="audio.mp3" type="audio/mpeg"></audio>
<button id="btn">play</button>
<div class="elem">000</div>

或者通过非常“hacky”的方式重新创建回调函数向其添加参数变量,但它存在范围问题:

var el = {
  'btn1': '#btn',
  'time1': '#time',
  'audio': 'audio',
  'elem': '.elem'
}

function selectElements(obj, fn) {
  if (typeof fn === 'function') {
    const that = {};
    for (let i in obj)
      that[i] = document["querySelector" + (obj[i][0] == "#" ? "" : "All")](obj[i]);

    let f = fn.toString();
    return new Function(...Object.keys(that), f.slice(f.indexOf("{") + 1, f.lastIndexOf("}"))).apply(null, Object.values(that));
  }
}

selectElements(el, function() {
  console.log("global", window.btn1, window.time1, window.audio, window.elem);
  console.log("local", btn1, time1, audio, elem)
  console.log("this", this.btn1, this.time1, this.audio, this.elem)
})


//this doesn't work, because callback function will be recreated in different scope
for(let i = 0; i < 3; i++)
{
  selectElements(el, function()
  {
    console.log(i);
    console.log(btn1);
  });
}
<div id="time"></div>
<audio controls src="audio.mp3" type="audio/mpeg"></audio>
<button id="btn">play</button>
<div class="elem">000</div>

虽然我不会推荐任何这些方法......

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将字典作为输入参数传递给函数全局/局部变量问题

来自分类Dev

将局部变量传递给指令作为输入

来自分类Dev

如何将局部变量传递给 lambda 函数?

来自分类Linux

将局部变量传递给信号处理函数

来自分类Dev

PowerShell:将局部变量传递给函数

来自分类Dev

将局部变量通过类传递给函数

来自分类Dev

如何将函数中的局部变量作为默认值传递给 R 中的嵌套变量?

来自分类Dev

无法将对象数组传递给函数?

来自分类Dev

Rust:无法在返回值中引用局部变量 - 但“局部变量”被传递给调用者

来自分类Dev

是否可以将对象作为变量传递给graphQL突变?

来自分类Dev

如何将对象作为参数传递给函数?

来自分类Dev

将对象作为参数传递给构造函数?

来自分类Dev

如何将对象作为参数传递给函数

来自分类Dev

在Javascript中将对象作为参数传递给函数

来自分类Dev

将对象HTMLInputElement作为参数传递给函数

来自分类Dev

如何将对象的属性作为参数传递给函数

来自分类Dev

将对象作为参数传递给函数:MATLAB

来自分类Dev

将对象作为参数传递给C ++中的函数

来自分类Dev

局部变量作为函数调用的参数

来自分类Dev

密封对象内的局部变量可以将信息传递给全局变量吗?

来自分类Dev

如何使用作为参数传递给方法的类类型来定义局部变量

来自分类Dev

如何将局部变量值从函数传递给 addEventListener 函数?

来自分类Dev

无法将变量传递给局部变量(Rails5)

来自分类Dev

将对象作为变量传递

来自分类Dev

无法将对象数组传递给 React 中的 setPeople 函数

来自分类Dev

无法将对象传递给Typescript中的构造函数

来自分类Dev

如何在获取调用函数返回的内容时将局部变量传递给回调?

来自分类Dev

将指向局部变量的指针传递给函数:安全吗?

来自分类Java

如何将对象类型作为参数传递给构造函数并向其强制转换变量(JAVA)?

Related 相关文章

  1. 1

    将字典作为输入参数传递给函数全局/局部变量问题

  2. 2

    将局部变量传递给指令作为输入

  3. 3

    如何将局部变量传递给 lambda 函数?

  4. 4

    将局部变量传递给信号处理函数

  5. 5

    PowerShell:将局部变量传递给函数

  6. 6

    将局部变量通过类传递给函数

  7. 7

    如何将函数中的局部变量作为默认值传递给 R 中的嵌套变量?

  8. 8

    无法将对象数组传递给函数?

  9. 9

    Rust:无法在返回值中引用局部变量 - 但“局部变量”被传递给调用者

  10. 10

    是否可以将对象作为变量传递给graphQL突变?

  11. 11

    如何将对象作为参数传递给函数?

  12. 12

    将对象作为参数传递给构造函数?

  13. 13

    如何将对象作为参数传递给函数

  14. 14

    在Javascript中将对象作为参数传递给函数

  15. 15

    将对象HTMLInputElement作为参数传递给函数

  16. 16

    如何将对象的属性作为参数传递给函数

  17. 17

    将对象作为参数传递给函数:MATLAB

  18. 18

    将对象作为参数传递给C ++中的函数

  19. 19

    局部变量作为函数调用的参数

  20. 20

    密封对象内的局部变量可以将信息传递给全局变量吗?

  21. 21

    如何使用作为参数传递给方法的类类型来定义局部变量

  22. 22

    如何将局部变量值从函数传递给 addEventListener 函数?

  23. 23

    无法将变量传递给局部变量(Rails5)

  24. 24

    将对象作为变量传递

  25. 25

    无法将对象数组传递给 React 中的 setPeople 函数

  26. 26

    无法将对象传递给Typescript中的构造函数

  27. 27

    如何在获取调用函数返回的内容时将局部变量传递给回调?

  28. 28

    将指向局部变量的指针传递给函数:安全吗?

  29. 29

    如何将对象类型作为参数传递给构造函数并向其强制转换变量(JAVA)?

热门标签

归档