Я работаю над транскодером для проекта и сталкивался с необычным случаем края.Почему член вызова функции не может быть назначен переменной
У меня есть следующие:
function a(func){
return func.call()
}
по разным причинам транскодер хочет изменить его на:
function a(func){
var tmp = func.call;
var res = tmp()
return res;
}
Однако, вызов tmp()
возвращается с tmp is not a function
. Если я отлаживаю и приостанавливаю только эту строку, то tmp
определяется как функция.
Это как-то связано с его подписью function call(){ [native code]}
?
Существуют ли другие функции, которые будут вызывать подобные ошибки?
Есть ли способ обойти это, кроме как просто не делать этого?
EDIT: я нашел еще один случай, похоже, это может быть связано с контекстом объекта:
a = { toString: null }.propertyIsEnumerable
a("toString")
бросает ту же ошибку.
EDIT: некоторый контекст; Я пишу транскодер, он имеет очень специфический прецедент, где каждая строка кода разделяется на простейшие составные части. Возможно, я просто не могу отделить его дальше этого. Используя приведенный выше пример, func.call() - это операция доступа к членству, за которой следует выражение вызова, я хочу выделить доступ к члену и вызывать выражение в двух отдельных выражениях.
* Любой * метод, опираясь на 'this' значение, в том числе родной' Function.prototype.call', имеет эту проблему. Решение состоит в том, чтобы связать его с объектом или не использовать такой дерьмовый перекод. – Bergi
Почему транскодирование требует от вас перехода на функцию? – MayorMonty
Есть ли способ сделать это, все еще разделяя выражение на его составные части? например, 'tmp (func)', а не 'tmp()' –