如何仅使用括号而不使用javascript中的函数?

时间:2019-09-10 13:35:02

标签: javascript

这个问题可能不清楚,所以我在这里将其清除。我正在使用require.js导入脚本中的脚本。这是一段代码:

 var vr = {};
 vr.example = function(func) {
 return require(["https://example.com"], func);
 };

所以,现在我可以通过以下方式调用它:

vr.example( function() { .... });

但是,我正在考虑不在每次必须调用该函数时编写该函数。我想写这样的东西:

 vr.example({ ... });

并且结果应该相同。但是我不明白该怎么做。所以请帮忙

谢谢。

4 个答案:

答案 0 :(得分:1)

您想要的事情无法用JavaScript完成!但是有一种方法可以做,就是翻译。这是一个基本的例子。我真的不建议这样做,我只是向您展示一种可能性;)

window.InterpretData = function() {
    var el = document.querySelectorAll("script[type='text/test']") // You can change it anyway !
    for(var i = 0; i < el.length; ++i) { // You can use i++ instead of ++i, but ++i is much optimised for this function, watch out their differences in the internet.
      var val = el[i].innerHTML
      var crt = document.createElement("script")
      crt.id = "InterpretedScript"
      document.getElementsByTagName("body")[0].appendChild(crt) // Creating a new script element
      val = val.replace(/\.example\(\{([\S\s]*?)\}\)/gm, function(_, a) { // Wish you are familiar with regular expressions
          a = ".example( function() {" + a + "})"
          document.getElementById("InterpretedScript").innerHTML += a;
      }
   }
}

现在您可以:

<!DOCTYPE html>
<body>
  <script type="text/test">
     // Defining 
     var vr = {};
     vr.example = function(func) {
        return require(["https://example.com"], func);
      };
     // Calling
     var.example({ ... })
  <script>
  <script>
     new InterpretData()
  </script>
</body>
</html>

输出:

 vr.example({ ... }) converts to vr.example( function() { ... })

好吧,请记住该示例只是为了给您一个解决问题的可能性的想法。尽管您不能再次对包含不同参数的任何其他常量/变量声明“ example()”,但这并不是完美的解决方案!因此,唯一的方法就是要么使用ES6的粗箭头(=>),要么就更早地声明该函数并继续重用它!如果您必须支持旧的浏览器,而不是使用@mbojko所示的重用技术,或者只使用ES6的粗箭头,@ deceze先前曾说过。所以,你想吗?

答案 1 :(得分:0)

那么,您要传递没有用函数包装的代码块吗?简短的答案:您无法在JavaScript中做到这一点。而且require.js确实希望有回调函数。

如果回调函数是可重用的,则可以声明一次并按如下方式重用它:

function myReusableCallback(args) {
//...
}

vr.example(myReusableCallback);

差不多了。

答案 2 :(得分:0)

因为从require()返回的vr.example()函数需要一个回调函数,并且由于该回调函数通常是由vr.example的调用提供的,因此,它意味着您不必调用随便添加对象。因此,只有在require()期望没有回调的情况下,或者如果您有始终要执行的静态函数时,才可以使用对象,然后可以在vr.example和然后只需在函数内部传递您需要使用的对象即可。

答案 3 :(得分:-1)

这是不可能的,因为{}不是函数,而是对象。

您可以使用typeof({})自己尝试一下,然后将其与typeof(() => {})typeof(function() {})

进行比较。