Внедрение динамического сфера с использованием сJavascript

Форум по Javascript
Ответить
Anonymous
 Внедрение динамического сфера с использованием с

Сообщение Anonymous »

Предисловие:

У меня есть приложение, где я хочу позволить пользователям вводить в основном математический код для создания моделирования. В настоящее время он использует MathJ для оценки фрагментов кода, но без контрольных операторов это немного негибко. Даже позволить пользователю импортировать произвольный код и вводить его в MathJS, является несколько тупым. Что я хотел бы, так это то, что является относительно надежным против случайных ошибок со стороны несущественных пользователей . Похоже, что это повлияет на большие накладные расходы во время выполнения, поэтому я разработал альфа-альтернативу, основанную на утверждениях и объекте, похожий на Proxy'D, и я надеюсь получить некоторую конструктивную критику в отношении производительности и относительной безопасности. /> Разрешить контексты Scoped '(мне нужно всего лишь 3 глубины). Реализация ниже получена из MathJs < /li>
Если свободная переменная не обнаружена ни в какой области, создайте ее в текущей области, в противном случае обновите ее в сфере ее. вещи, но я также думаю, что это может потребоваться. Я хотел бы помешать кому -то случайно перезаписать мои свойства объекта Proxy'd - это способ сделать это? Сделать ли я это в прокси или объекте?class MapScope {
constructor (parent=null) {
this.localMap = new Map()
this.parentScope = parent;
}

has (key) {
return this.localMap.has(key) ? true : this.parentScope?.has(key) ?? false;
}

get (key) {
return this.localMap.get(key) ?? this.parentScope?.get(key)
}

set (key, value) {
const iGetIt = ! this.parentScope?.has(key) || this.localMap.has(key);
return iGetIt ? this.localMap.set(key, value) : this.parentScope.set(key, value);
}

keys () {
if (this.parentScope) {
return new Set([...this.localMap.keys(), ...this.parentScope.keys()])
} else {
return this.localMap.keys()
}
}

size() { return this.localMap.size();}

forEach(cb, thisArg=this.localMap) {
this.localMap.forEach(cb, thisArg);
}

delete (key) {
// return false;
return this.localMap.delete(key)
}

deleteProperty (p) {
//return false;
return this.localMap.delete(p)
m }

clear () {
return this.localMap.clear()
}

toString () {
return this.localMap.toString()
}
}
< /code>
Вот объект TRAPS для прокси: < /p>
var mapTraps = {
// This says that variables in the local scope shadow the global ones
// and that any new variables will be in the local scope
has(target, key) {
console.log(`called: has(..., ${key})`);
if (key in globalThis && ! target.has(key)) {
return false;
}
return true;
},

get(target,key,receiver) {
if (!target.has(key)) {
if (key in globalThis) {
console.log(`get ${key.toString()} from globalThis`);
return globalThis[key];
} else {
return undefined;
}
}
console.log(`get ${key.toString()} from target`);
return target.get(key);
},

//
set(target, key, val){
console.log(`called: set(..., ${key.toString()})`);
return target.set(key,val);
}
}
< /code>
Вот как вы собираете эти два вместе - Vars, потому что лапши в узле: < /p>
var mscope = new MapScope()
var nscope = new MapScope(mscope)
var rscope = new MapScope(nscope)
var mproxy = new Proxy(mscope, mapTraps)
var nproxy = new Proxy(nscope, mapTraps)
var rproxy = new Proxy(rscope, mapTraps)
< /code>
Таким образом, MSCOPE - это прицел Toplevel, NSCOPE находится между ним и RSCOPE. < /p>
Тестирование выглядит так: < /p>
with (mproxy) {t = 0}
--> 0
with (mproxy) {t += 2 * Math.random()}
--> 1.75....
with(rproxy) {t true
with(nproxy) {t true
< /code>
Предполагаемое использование - это использование этих функций для создания функций выполнения для запуска кода пользователя в соответствующей области. См.: Изменение сферы функции для аналогичного решения или записей MDN на операторе с оператором и прокси. < /P>
function compileSnippet(exp) {
return new Function ("fscope", `
with(fscope) {
return ${exp} ;
}
`);
}

var startFn = compileSnippet(startExpr);
var startEachFn = compileSnippet(startEachExpr);

// evaluate in scope - typically for side-effect

startFn(nproxy)
...
startEachFn(nproxy)
...
// endEachFn and endFn also


Подробнее здесь: https://stackoverflow.com/questions/795 ... using-with
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»