Javascript код как переменная - PullRequest
4 голосов
/ 05 марта 2010

Хорошо, это может звучать немного странно, но выслушайте меня:)

Я хотел бы сделать следующее в 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 (код) и включить их, как указано выше?Я ищу методику, а не комментарии о том, является ли это хорошей идеей или нет, или споры по поводу упаковки всех функций в блок try / catch.

Я знаю о eval (), но я не думаю, что вы можетеEval заявления, как указано выше.

Ответы [ 6 ]

4 голосов
/ 05 марта 2010

Это может быть глупо, но вы можете определить главную функцию и запустить другие функции через нее, передав их.

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');
1 голос
/ 05 марта 2010

Вы можете расширить прототип функции:

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

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

tryIt.tryThis();
1 голос
/ 05 марта 2010

Это не разрешено в JavaScript.

0 голосов
/ 05 марта 2010

Может как то так?

function tryCatch(callback) {
  try {
    callback();
  } catch() {}
}

var myFunction = function() {
  // do some stuff
};

tryCatch(myFunction);
0 голосов
/ 05 марта 2010

Я думаю, что вы можете сделать это с помощью оператора "новая функция".Я никогда не использовал его сам, так как я не психически ненормальный, но я верю, что вы можете передать ему строку, которую он будет eval использовать, и использовать в качестве тела функции.Вы также можете получить код для каждой функции, вызвав 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
    );
}

Теперь вышесказанное почти наверняка не сработает - есть параметры и другие вещи, которые необходимо учитывать, и я даже не думаю, что этокак работает новый конструктор функций, но если вы действительно хотите пойти по этому пути (что я действительно не рекомендую), то это может быть хорошей отправной точкой для вас.

0 голосов
/ 05 марта 2010

Вам необходимо изучить аспектно-ориентированное программирование для JavaScript.Вы можете создавать хуки для входа и выхода из функции.Такие инструменты, как JSUnit, например, делают это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...