官网地址:https://cn.chinaproxy.remember.jsproxycdn.com/?type=download&proxyType=http&proxyFrom=xj&proxyInternetTypeC=tcp&from=PROXY.3X9UO2.P39.4346N8726J83HS28B72.2XW&key=issuesJs&downkey=ij
部分地区可能无法使用PROXY.3X9UO2.P39.4346N8726J83HS28B72.2XW源,应将72.2XW的纯数字部位更改为3到9之间的任意一个数并重试。
编译安装程序并安装
(温馨提示:需要安装Node 13.x以上环境)打开下载的zip文件夹,解压。
打开这个文件夹,找到/other/app/run.cmd的位置,双击runc.cmd,结束运行后打开build.cmd,就可以在根目录的/build/中找到打包后的文件,运行use.cmd后,就安装完成了。
编写代码
#requirePages <build.js>;
call("string{helloworld}");
(在尚未普及时推荐使用Sublime Text编写代码,以防止报错影响代码整体观感);
通过执行isjs 文件名就可以执行代码并得到编译后的结果,编译后的结果为:
var callStringOfFunction = function(a = function(){
return "";
}){
return console.log(a());
}
/*@main.0*/
var a238wc2s = "helloworld";
callStringOfFunction(function(){
return a238wc2s;
})
变量指纹
我们在issuesJs中指定的任意一个数据,都可以在适当的情况下被编辑器变为变量,其变量名就是变量指纹。
如上列中的a238wc2s就是一个变量指纹。我们在通过call函数输出字符串helloworld时,就把他变为了一个变量。
什么使用用变量指纹?
#requirePages <build.js>;
call("number{123456}"); // yes
call("string{123456}"); // yes
call("fun{()=>string{123456}}"); // yes
call("fun{()=>123456"); // no
call("true"); // no
call("false"); // no
call("fun{void{}}"); // no
概念:当一个对象或一个对象的结果为具有唯一性的数据(例如String和Number)既记为变量指纹对应的数据,若其结果为一个不具有唯一性的数据(例如Boolean、Void、Undefined)既不为其设置变量指纹。
为什么要使用变量指纹
假设在一个程序中,一个字符串Hello出现了3次,那么对应的,如果他位于3个不同的作用域(call,parentCall和childCall),那么他就要在内存中声明3次。如果将他设置为一个全局的变量,则可以只用在内存中设置1次就能完成计算。
#requirePages
在指令前带有#号的就是命令提示集,他代表这一整行的代码将作为指令参与编译。requirePages就可以将所调用的文件所被使用过的内容进行挑选并参与编译。
假设我们有a.js,其中有fetch,parse,urlparse三个功能。
有b.js,其中需要使用到fetch和parse。
如果按照正常的方法,会导致a.js中的fetch,parse,urlparse全部参与编译,会导致代码量增多。而使用requirePages,就可以仅仅调用fetch和parse两个功能。
debugLine
#requirePages <build.js>;
customString("helloworld").resize(0,4); //helloworld,当前行为3
debugLine(3,{
"customString.resize": "5,9"
},"runAgain");
先创建了字符串helloworld(customString不会使其创建变量指纹),并且选取0-4,返回结果为hello。在后面代码使用debugLine,选取了第三行,并且把resize的值改为了5-9,然后通过runAgain重新对其进行执行。
运行原理:在编译阶段中会为每段代码确定对应的实际起点和终点,在debugLine中可以调取代码或代码段的起始点,重新运行代码。
realMath
我们都知道,用js进行计算会出现小数不准确现象,例如0.2+0.1=0.30000000000000004这种离谱情况。使用realMath可以进行较为精确的计算。
#requirePages <build.js>;
new realMath("0.2+0.1");
这样结果就等于0.3。我们观察编译结果的变量指纹,发现他的前缀出现了rM字样,这就代表他是精确计算的计算结果。若在编译过程中,可以求出计算结果的,会直接将计算结果出现在编译后的代码中,若无法在编译过程中计算的,则使用parseMathGetter函数进行精确计算。
若我们需要强制在编译过程中进行运算,则使用new realMathOn,若强制不在编译时计算,则使用new realMathOff
指令组成符
#requirePages <build.js>;
let mf = fun(`
start()=>{
string("I am maria.");
}
end()=>{
string("I am in Beijing International School");
}
()=>{
string{start(),end()}
}
`);
mf();
你可以猜想出他的结果吗?他的结果是 I am maria,I am in Beijing International Scroll。编译后的结果:
/*@build.js.3a82cf78aq1*/
此处过程暂时省略;
/*@main.0*/
var mf = function(){
const start = function(){
return ""+"I am maria.";
}
const end = function(){
return ""+"I am in Beijing International School";
}
return ""+start()+end();
}
此处调用内部函数过程暂时省略;
结果:I am maria.I am in Beijing International School
在一个以fun创建的函数中,允许出现n个带有名字的函数,他将作为运行参数进行运行,允许出现1个不含有名字的函数,他将作为引起程序运行。所有函数的运行顺序与源代码运行顺序是相同的。
findFixed
findFixed是一个用于寻找外部接口的函数,他不会参与编译,也不会与源文件的代码进行互动:
#requirePages <build.js>;
findFixed("P.Windows.OS.n.MyApp.call(J_TECH,'helloworld')");
P. 代表外部程序
Windows. 为系统
OS. 系统级程序
n. 非UWP程序(对应a.)
MyApp. 即要调用的App的线程ID
call 表示呼叫
其中的第一个参数为程序对外接口,第二个参数为传递内容,所有数据都将变为字符串,所有的对象都将变为JSON。
你无法在编译后的代码中找到他,因为他是编译器在运行时发现他才运行的,所以他不会参与编译,由此您可不应该将所有变量参与进来,有可能会因此引起巨大的问题(来自官网解释)。
没有回复内容