Используя JavascriptCore, как вы можете вызвать функцию JavaScript с «this», установленным в «undefined»? - PullRequest
0 голосов
/ 28 января 2020

Глядя на документацию для JSObjectCallAsFunction в JavaScriptCore, он говорит следующее:

JSValueRef JSObjectCallAsFunction(
  JSContextRef ctx,
  JSObjectRef object,
  JSObjectRef thisObject,
  size_t argumentCount,
  const JSValueRef arguments[],
  JSValueRef *exception);

thisObject
Объект, используемый как «this», или NULL, чтобы использовать глобальный объект как «this».

thisObject, на который он ссылается, - это объект, связанный с JS this ключевое слово. JavaScript имеет некоторые интересные правила вокруг this, но в некоторых случаях this устанавливается на undefined, особенно в строгом режиме. Например:

function f2() {
  'use strict'; // This makes the function strict,
                // but it's possible to make the whole file strict.
  return this;
}

f2() === undefined; // true

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

Как говорят в документах, я не могу просто указать nullptr как thisObject в JSObjectCallAsFunction, иначе он просто будет использовать глобальный объект. Их исходный код довольно четко демонстрирует это поведение .

Нет проблем, я думал, мы можем просто использовать 1039 * функцию JSValueMakeUndefined и передайте это как thisObject. Но проблема в том, что он возвращает JSValueRef, а не JSObjectRef, и вызов JSValueToObject для undefined заставляет его вернуть исключение: TypeError: undefined is not an object. Это имеет какой-то смысл: undefined не является объектом, и поэтому преобразование его в один не имеет никакого смысла.

Но это, кажется, делает невозможным this быть undefined в любая функция вызывается из JSObjectCallAsFunction, потому что строго требует объекта.

Я мог бы попробовать альтернативу, например, оставить this пустым объектом, но я бы действительно предпочел оставив this как undefined для согласования с тем, как работает строгий режим.

Есть ли способ на самом деле это сделать, или это на самом деле невозможно?

...