Глядя на документацию для 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
для согласования с тем, как работает строгий режим.
Есть ли способ на самом деле это сделать, или это на самом деле невозможно?