2010-03-05 3 views
4

Ok, это может показаться немного сумасшедшим, но выслушай меня :)код Javascript в качестве переменной

Я хотел бы сделать следующее в 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(), но я не думаю, что вы можете делать заявления, подобные приведенным выше.

+0

Я думаю, я получаю то, что вы пытаетесь сделать, что использовать предварительно написанные фрагменты для создания новых функций, в то время как я не уверен, это отличный подход, я думаю, что лучший способ добиться этого - использовать серверный язык как своего рода «компилятор», где у вас есть небольшой язык шаблонов, который вы используете в javascript, просто что-то вроде {{snippet1} }, а затем использовать серверный язык, который будет проходить и заменять каждый экземпляр {{snippet1}}, например, с помощью соответствующего фрагмента кода, тогда вы можете повторно запустить его в любое время, когда что-то изменится, и у вас есть js cript files updated – Rick

ответ

1

Это недопустимо в JavaScript.

+0

Да, понятно - но есть ли техника, которая может достичь этой цели? – Jack

+1

Насколько я знаю, нет. Похоже, вы пытаетесь имитировать макрос, и я считаю, что макросы используются с языком-совместителем, а не интерпретируются. –

0

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

4

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

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'); 
+0

Неплохая идея на самом деле! – nickf

+0

Это может быть больше похоже на «способ Javascript». –

+0

Можете ли вы привести пример, который передает аргументы функции? – Asaph

0

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

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

+1

+1 приятное имя переменной :) – alex

0

Возможно, что-то вроде этого?

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

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

tryCatch(myFunction); 
1

Вы можете продлить прототип функции:

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

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

tryIt.tryThis(); 
+0

Мне тоже нравится эта идея. – Jage