【问题标题】:Javascript code as a variableJavascript 代码作为变量
【发布时间】:2011-01-23 23:30:50
【问题描述】:

好吧,这可能听起来有点疯狂,但请听我说完 :)

我想在 javascript 中执行以下操作:

define START_OF_EVERY_FUNCTION = "try {"
define END_OF_EVERY_FUNCTION   = "} catch () {}"

function TEST () {
    START_OF_EVERY_FUNCTION
    // rest of function
    END_OF_EVERY_FUNCTION
}

基本上,我可以定义一个 javascript 行(代码)列表并像上面一样包含它们吗?我正在寻找一种与 cmets 相比的技术,以了解这是否是一个好主意,或者就将所有函数包装在 try/catch 块中进行辩论。

我知道 eval(),但我认为你不能像上面那样 eval 语句。

【问题讨论】:

  • 我想我得到了你想要做的事情,即使用预先编写的 sn-ps 来构建新功能,虽然我不确定这是一个很好的方法,但我认为最好实现这一点的方法是使用服务器端语言作为一种“编译器”,您可以在其中使用一种在 javascript 中使用的小型模板语言,就像 {{sn-p1}} 之类的东西,然后使用服务器端将通过并替换 {{sn-p1}} 的每个实例的语言,例如,使用相应的代码 sn-p,然后您可以在任何时候重新运行它,并且您可以更新您的 jscript 文件

标签: javascript code-reuse


【解决方案1】:

这可能很愚蠢,但您可以定义一个主函数并通过传入其他函数来运行其他函数。

var execute = function(func){
    alert('before');
    func();
    alert('after');
};

function sayHi(){
    alert('hi there');
}

execute(sayHi);

根据要求,传递参数的示例。

var execute = function(func){
    alert('before');
    var ret = func.apply(null, Array.prototype.slice.call(arguments, 1));
    alert('after');
};

function saySomething(sayWhat){
    alert(sayWhat);
}

execute(saySomething,'hey there');

【讨论】:

【解决方案2】:

这在 JavaScript 中是不允许的。

【讨论】:

  • 是的,很明显 - 但有没有一种技术可以实现这一目标?
  • 据我所知,没有。看起来您正在尝试模拟宏,并且我相信宏与编译器语言一起使用,而不是解释。
【解决方案3】:

你可以扩展函数原型:

Function.prototype.tryThis = function() {
    try {
        this();
    }catch(ex){
        alert('Caught '+ex);
    };
};

function tryIt() {
    alert('Inside tryIt');throw "My Error from tryIt";
}

tryIt.tryThis();

【讨论】:

    【解决方案4】:

    您需要研究 JavaScript 的面向方面编程。您可以为函数进入和退出创建钩子。例如,像 JSUnit 这样的工具就是这样做的。

    【讨论】:

      【解决方案5】:

      我认为您可以使用“new Function”运算符来做到这一点。我自己从来没有使用过它,因为我在临床上并没有发疯,但我相信你可以传递一个字符串,它将evaluate 用作函数体。您还可以通过调用myFunction.toString() 获取每个函数的代码。所以放在一起,它会是这样的:

      var functionsToMessUp = ['myFunc1', 'myFunc2'];
      
      for (var i = 0; i < functionsToMessUp.length; ++i) {
          var theFunc = window[functionsToMessUp[i]]; // assuming they're in global scope
          window[functionsToMessUp[i]] = new Function(
              START_OF_EVERY_FUNCTION
              + theFunc.toString()
              + END_OF_EVERY_FUNCTION
          );
      }
      

      现在,上面的方法几乎肯定行不通——需要考虑参数和其他事情,我什至不认为 new Function 构造函数是这样工作的,但如果你真的想走这条路(我真的不推荐),那么这对你来说可能是一个很好的起点。

      【讨论】:

        【解决方案6】:

        也许是这样的?

        function tryCatch(callback) {
          try {
            callback();
          } catch() {}
        }
        
        var myFunction = function() {
          // do some stuff
        };
        
        tryCatch(myFunction);
        

        【讨论】:

          猜你喜欢
          • 2013-10-12
          • 2013-03-21
          • 2017-09-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-10
          • 2014-07-13
          • 1970-01-01
          相关资源
          最近更新 更多