首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取JavaScriptCore中的默认导出

获取JavaScriptCore中的默认导出
EN

Stack Overflow用户
提问于 2021-02-15 10:26:21
回答 2查看 50关注 0票数 1

目标:我正在尝试在JavaScriptCore中运行JSLint。

旧版本

较早的JSLint版本公开了一个名为JSLINT的全局函数,如下所示:

代码语言:javascript
复制
var JSLINT = (function () {
    ...
}

这很容易在JavaScriptCore中检索和执行:

代码语言:javascript
复制
// Assume 'ctx' is a JSGlobalContextRef
// Assume we have already called JSEvaluateScript()

JSStringRef jsFunctionName = JSStringCreateWithUTF8CString("JSLINT");
JSValueRef jsLintFunctionValue = JSObjectGetProperty(ctx, JSContextGetGlobalObject(ctx), jsFunctionName, NULL);
JSStringRelease(jsFunctionName);
    
JSObjectRef jsLintFunction = JSValueToObject(ctx, jsLintFunctionValue, &exception);

有了这个引用,我就可以使用JSObjectCallAsFunction()来执行函数了。工作得很完美。

新版本

现在,JSLint移动到了这个位置:

代码语言:javascript
复制
export default Object.freeze(function jslint(
    source = "",
    option_object = empty(),
    global_array = []
) { 
    ... 
});

JavaScriptCore的文档很差。我尝试了很多东西,但显然遗漏了一些显而易见的东西。现在如何检索和执行jslint函数?

EN

回答 2

Stack Overflow用户

发布于 2021-07-27 21:10:42

快速版本

如果@kaizhu的答案没有给你想要的东西,另一个接近你以前拥有的状态的选择是...

对于小写jslint

  1. 注释掉两行导出代码

以下是您需要用今天版本的JSLint注释掉的两行代码。

代码语言:javascript
复制
// export default Object.freeze(jslint_export);
// jslint_import_meta_url = import.meta.url;

如果您将现在编辑文件包含在项目中,则函数jslint位于您的全局作用域中。

代码语言:javascript
复制
console.log(JSON.stringify(jslint("var a = 5").warnings, null, "  "))

结果:

代码语言:javascript
复制
[
  {
    "a": ";",
    "b": "(end)",
    "code": "expected_a_b",
    "column": 9,
    "line": 1,
    "line_source": "var a = 5",
    "name": "JSLintError",
    "message": "Expected ';' and instead saw '(end)'.",
    "formatted_message": " 1. \u001b[31mExpected ';' and instead saw '(end)'.\u001b[39m \u001b[90m// line 1, column 9\u001b[39m\n    var a = 5"
  }
]

我认为您对代码所做的唯一更改就是将jslint小写

代码语言:javascript
复制
JSStringRef jsFunctionName = JSStringCreateWithUTF8CString("jslint");

改进?

请注意,使用jslint_export可能“更合适”,它是jslint的冻结副本。

代码语言:javascript
复制
JSStringRef jsFunctionName = JSStringCreateWithUTF8CString("jslint_export");

如果您真的想这样做,您可以将jslint_export变量替换为JSLINT,而无需更改JavaScriptCore代码。

代码语言:javascript
复制
// let jslint_export;              // The jslint object to be exported.
let JSLINT;                        // The jslint object to be exported.

// lots of stuff skipped

// jslint_export = Object.freeze(Object.assign(jslint, {
JSLINT = Object.freeze(Object.assign(jslint, {
    cli: Object.freeze(jslint_cli),
    edition: jslint_edition,
    jslint: Object.freeze(jslint.bind(undefined))
}));

我必须仔细检查旧代码,看看它的行为是否相同,但请注意,在该构造中,实际的linting函数将位于JSLINT.jslint上。

然而,我不确定为什么在当前版本的JSLint中会有如此多的全球范围的污染。为什么这些不都存在于IIFE中是令人困惑的;我想过去是这样的?无论如何,这应该可以解决您的问题。

票数 1
EN

Stack Overflow用户

发布于 2021-06-22 04:17:03

将jslint导入为es-module的说明为here

代码语言:javascript
复制
/*jslint devel*/
import jslint from "./jslint.mjs";
let code = "console.log('hello world');\n";
let result = jslint(code);
result.warnings.forEach(function ({
    formatted_message
}) {
    console.error(formatted_message);
});

// stderr
// 1 Undeclared 'console'. // line 1, column 1
// console.log('hello world');
// 2 Use double quotes, not single quotes. // line 1, column 13
// console.log('hello world');
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66202048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档