- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试将一些库预加载到全局范围内(例如 chai.js)。这改变了一些对象的原型(prototype),我意识到这适用于 ENGINE_SCOPE 但不适用于 GLOBAL_SCOPE。
最小的例子:
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
Bindings globalBindings = engine.createBindings();
engine.eval("Object.prototype.test = function(arg){print(arg);}", globalBindings);
//works as expected, printing "hello"
engine.getContext().setBindings(globalBindings, ScriptContext.ENGINE_SCOPE);
engine.eval("var x = {}; x.test('hello');");
//throws TypeError: null is not a function in <eval> at line number 1
engine.getContext().setBindings(engine.createBindings(), ScriptContext.ENGINE_SCOPE);
engine.getContext().setBindings(globalBindings, ScriptContext.GLOBAL_SCOPE);
engine.eval("var x = {}; x.test('hello');");
是否有解决方法使其按预期工作,即更改从全局范围正确传播到引擎范围?
最佳答案
全局作用域只能用于简单的变量映射。例如:
ScriptContext defCtx = engine.getContext();
defCtx.getBindings(ScriptContext.GLOBAL_SCOPE).put("foo", "hello");
Object
存在于引擎范围内,因此甚至不会在全局范围内搜索与其相关的任何映射(在您的情况下为 Object.prototype.test
)。
文档摘录:
The default context's ENGINE_SCOPE is a wrapped instance of ECMAScript "global" object - which is the "this" in top level script expressions. So, you can access ECMAScript top-level objects like "Object", "Math", "RegExp", "undefined" from this scope object. Nashorn Global scope object is represented by an internal implementation class called jdk.nashorn.internal.objects.Global. Instance of this class is wrapped as a jdk.nashorn.api.scripting.ScriptObjectMirror instance. ScriptObjectMirror class implements javax.script.Bindings interface. Please note that the context's GLOBAL_SCOPE Bindings and nashorn global object are different. Nashorn's global object is associated with ENGINE_SCOPE and not with GLOBAL_SCOPE. GLOBAL_SCOPE object of default script context is a javax.script.SimpleBindings instance.The user can fill it with name, value pairs from the java code.
https://wiki.openjdk.java.net/display/Nashorn/Nashorn+jsr223+engine+notes
-Dnashorn.args=--global-per-engine
来使用 --global-per-engine 选项
。然后 Nashorn 将使用全局对象的单个实例进行所有脚本评估,无论是否传递了 ScriptContext。ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
SimpleScriptContext context = new SimpleScriptContext();
engine.eval("Object.prototype.test = function(arg){print(arg);}", context);
engine.eval("var x = {}; x.test('hello');", context);
每次您需要一个带有库的新上下文时,只需创建它:
public static void main(String[] args) throws ScriptException {
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
SimpleScriptContext context1 = createContextWithLibraries(engine);
//works as expected, printing "hello"
engine.eval("var x = {}; x.test('hello'); var y = 'world';", context1);
SimpleScriptContext context2 = createContextWithLibraries(engine);
//works as expected, printing "hello"
engine.eval("var x = {}; x.test('hello');", context2);
//works as expected, printing "world"
engine.eval("print(y);", context1);
//fails with exception since there is no "y" variable in context2
engine.eval("print(y);", context2);
}
private static SimpleScriptContext createContextWithLibraries(ScriptEngine engine) throws ScriptException {
SimpleScriptContext context = new SimpleScriptContext();
engine.eval("Object.prototype.test = function(arg){print(arg);}", context);
return context;
}
关于java - 原型(prototype)在 nashorn 中从 globalscope 更改为 enginescope,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60946483/
我正在尝试使用 0.30.0 中的最新协程,但无法弄清楚如何使用新的范围。在最初的协程中,我可以使用 UI 或 CommonPool 设置上下文,一切正常。 现在我在从房间数据库读取数据时尝试在 Vi
GlobalScope 和 MainScope 有什么区别? //Accessing data from Room GlobalScope.launch { v.tvStore
我有这个代码的问题。 https://kotlinlang.org/docs/reference/coroutines/basics.html fun main() { GlobalScope
如果处理时间超过 250 毫秒,我想显示进度对话框。 我正在尝试使用协程来完成。我的问题是我是否删除“delay(250)”行,它总是先运行 dismissProgressDialog() 然后运行
我读到强烈建议不要使用 Globalscope,here . 我有一个简单的用例。对于我收到的每条 kafka 消息(比如说一个 Id 列表),我必须拆分它并同时为每个 Id 调用一个休息服务,然后等
我正在使用 Kotlin,现在 android studio 建议我 添加 This is a delicate API and its use requires care. Make sure yo
Kotlin 的 runBlocking Coroutine 应该阻塞当前线程,直到块内的 Coroutine 完成执行,但是当块内的 Coroutine 是 GlobalScope.launch 时
我习惯使用 AsyncTask并且由于它的简单性而很好地理解它。但是Coroutines让我很困惑。您能否以简单的方式向我解释以下各项的区别和目的是什么? GlobalScope.launch(Dis
假设 CoroutineScope 是由一些生命周期感知组件实现的,比如 Presenter。什么时候使用 GlobalScope.produce 与 CoroutineScope.produce 比
这两种方法有什么区别吗? runBlocking { launch(coroutineDispatcher) { // job } } GlobalScope.launch(c
我有这个功能 override fun trackEvent(trackingData: TrackingData) { trackingData.eventsList()
我正在jetpack compose中编写一些寻呼机代码,遇到了需要通过单击按钮来更改页码的情况。这是我点击按钮的事件: onClick = {pagerState.scrollToPage(page
我在 github 中有多模块 kotlin gradle 项目 here . 我的一个子项目introducing-coroutines与构建文件build.gradle.kts文件是here bu
我尝试运行 https://github.com/Kotlin/kotlinx.coroutines/blob/master/docs/basics.md#your-first-coroutine最新
我是 Kotlin 的新手 - 事实上我从来没有计划使用它,但我正在尝试使用 CameraKit库,它使用似乎是为其 API 接口(interface)生成的 Kotlin 层。我一直遇到相机未正确断
在 Kotlin 中有多种启动协程的方法。我发现了几个示例,其中 GlobalScope 和 CoroutineScope 被使用。但是后者是在启动协程时直接创建的: 使用 GlobalScope :
我读到在 GlobalScope 上运行例程是不好的做法。 现在正在做的是: class SplashScreen : AppCompatActivity() { override f
globalScope 、 coroutineScope 和 viewModelScope 有什么区别,何时在 Kotlin 编程中使用它们,而 viewModelScope 仍在开发中? 我已经通过
从 Activities、Fragments 或 Android 架构组件 ViewModels 启动协程时,使用绑定(bind)到该 View 组件生命周期的协程范围是完全有意义的,以避免泄漏和释放
我正在尝试将一些库预加载到全局范围内(例如 chai.js)。这改变了一些对象的原型(prototype),我意识到这适用于 ENGINE_SCOPE 但不适用于 GLOBAL_SCOPE。 最小的例
我是一名优秀的程序员,十分优秀!