Предисловие:
У меня есть приложение, где я хочу позволить пользователям вводить в основном математический код для создания моделирования. В настоящее время он использует 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
Внедрение динамического сфера с использованием с ⇐ Javascript
Форум по Javascript
-
Anonymous
1743328561
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
Подробнее здесь: [url]https://stackoverflow.com/questions/79544412/implementing-dynamic-scope-using-with[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия