Как реализовать замыкания с помощью API SpiderMonkey? - PullRequest
1 голос
/ 09 февраля 2009

Я работал с API-интерфейсом SpiderMonkey C и хотел бы реализовать замыкание в C с использованием их API. Тот, который я хотел бы реализовать, довольно сложный, но я даже не могу понять, как сделать простой, такой как:

function x() {
   var i = 0;
   return function() { i++; print(i); };

}

var y = x();
y(); //1
y(); //2
y(); //3 

Мне было интересно, знает ли кто-нибудь, как я могу это сделать. Я нашел метод JS_NewFunction, но на самом деле я не знаю, является ли это шагом в правильном направлении. Любая помощь будет оценена, спасибо!

Ответы [ 2 ]

0 голосов
/ 14 октября 2010

Рассказано, как будто вы, вероятно, все еще заинтересованы, год спустя.

Яростно брови по документации для JS_GetParent , я вижу

Для некоторых функций он используется для реализации лексической области видимости (но это детали реализации).

, а затем вместе со списком функций API, которые создают функции,

Некоторые из этих функций позволяют приложению указывать родительский объект. Если функция JSAPI, создающая объект, имеет родительский параметр, и приложение передает ему ненулевое значение, тогда этот объект становится родительским для нового объекта. В противном случае, если в контексте выполняются какие-либо сценарии или функции, на их основе выбирается родительский объект по умолчанию.

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

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

</necro>
0 голосов
/ 09 февраля 2009

Я не знаю, есть ли чистый C способ делать замыкания или нет. Однако я бы порекомендовал, если вы можете, просто реализовать необходимую вам функциональность в javascript и просто оценить текст javascript в JSAPI. Оттуда используйте JSAPI, чтобы получить любые дескрипторы / переменные, необходимые для реализации функциональности вашего хоста. Делать javascripty вещи, используя JSAPI, действительно обременительно, избегайте этого, если можете.

...