UglifyJS怎么混淆js?js 变量声明易混淆的几点知识
本文目录
UglifyJS怎么混淆js
如果你是全局安装的,可以直接在需要混淆文件的目录下,
按住shift键右击鼠标选择在此处打开命令窗口如图
2.打开窗口后直接在窗口执行
uglifyjs main.js demo.js -o foo.min.js --source-map foo.min.js.map --source-map-root
新建文件package.json{ "name": "nodejs-uglifyjs2", "version": "0.0.1", "description": "uglifyjs2", "author": "Conan Zhang ", "dependencies": { }}
4.执行npm install uglify-js --save下载UglifyJS2依赖包
5.安装完成后
新建test.js开始测试var UglifyJS = require(’uglify-js’); //代码压缩var result = UglifyJS.minify("var b = function () {};", {fromString: true});console.log("\n===========================");console.log(result); //文件压缩result = UglifyJS.minify();console.log("\n===========================");console.log(result.code);//多文件压缩,指定source map和网站来源result = UglifyJS.minify(,{ outSourceMap: "out.js.map", sourceRoot: "http://onbook.me", mangle:true});console.log("\n===========================");console.log(result.code);console.log(result.map);
js 变量声明易混淆的几点知识
变量提升
变量与函数名提升优先级
js 作用域内有变量,这个很好理解,但有一些细节需要注意。
console.log(foo); // 函数function foo(){ console.log("函数声明");}console.log(foo); // 函数var foo = "变量";console.log(foo); // 变量
当变量名与函数名同名,且都提升上去了,那最终结果是哪个声明起作用呢?
有两个知识点: 1. var foo;并不会覆盖之前的变量 2. 函数提升优先级比变量提升要高,且不会被变量声明覆盖,但是会被变量赋值覆盖,所以上面的代码实际上是
function foo(){ // 优先级最高,提升到最前面 console.log("函数声明");}var foo; // 只提升声明,不提升赋值,且不能覆盖函数声明console.log(foo); console.log(foo); foo = "变量"; // 可以覆盖函数声明console.log(foo);
连等赋值的变量提升
var num1 = 1; function fn(num3){ console.log(num1); //output undefined console.log(num3); //output 4 console.log(num4); //throw error “num4 is not defined” console.log(num2); //throw error “num2 is not defined” var num1 = num4 = 2; // js 连等赋值 num4 不会被提升 num2 = 3; // 没有 var 会挂载到全局作用域,但不会提升,所以之前会报错 var num3= 5; } fn(4);
if 判断内变量提升
if (true) { function fn(){ return 1; } }else { if(false){ function fn(){ return 2; } } } console.log(fn.toString()); console.log(fn())
以下是从找到这个例子的原文中摘抄的内容:chrome和ie一均为function fn(){ return 2;},而firefox中依然报错。 可见三者处理并不相同。ff中会提前变量的声明,但不会提前块级作用域中的函数声明。而chrome和ie下就会提前块级作用域中的函数声明,而且后面的声明会覆盖前面的声明。
函数的作用域内赋值
在js中,提到变量赋值,就要先说作用域,而作用域,在es6之前,只有函数才会形成独立的作用域,然后函数的嵌套形成了 js 的作用域链。子作用域内可以访问父级作用域内的元素。函数的作用域在函数确定的时候就已经确定,与调用无关。
// test1var x = 1;function foo(x) { var x = 3; var y = function() { x = 2; console.log(x) } y(); console.log(x); return y}var z = foo() // 2 2z() // 2
这段函数会输出三个 2 ,指向同一个 x,甚至,将 x 改为对象,就更明显了
// test2var x = "abc";function foo(x) { var x = c; var y = function() { return x; } return y;}var c = {a:1}var z = foo(); var b = z();console.log(b === c); // true
上面例子中,foo 函数执行后,返回 y 函数并赋值给 z,z 指向 y 函数(函数体),此时,z 并不在 foo 函数的作用域内,在此作用域不能访问到 x,但 z 只是引用类型数据的一个指针,只是同 x 指向了同一个对象而已。而执行 z 函数,则会返回 x 的值,这个值是函数 y 作用域内访问到的 x 的值,是根据函数的书写位置确定的作用域,并不会因为调用位置不同,而改变变量的指向。
但是同时要注意,虽然函数作用域在函数写出来时就已经确定,但具体的值却跟调用的时机有关。
// test3var x = "abc";function foo(x) { var x = c; var y = function() { x.a++; return x; } return y}var c = {a:1}var z = foo(); console.log(z()) // {a: 2}console.log(z()) // {a: 3}console.log(z()) // {a: 4}
这个例子中,输出的三次都是同一个对象,但输出的值不同,这是因为输出的时候的值不同,这就和调用时的实际值有关了。
npm安装完uglifyjs怎么对js代码进行混淆
如果你是全局安装的,可以直接在需要混淆文件的目录下,
按住shift键右击鼠标选择在此处打开命令窗口如图
2.打开窗口后直接在窗口执行
uglifyjs main.js demo.js -o foo.min.js --source-map foo.min.js.map --source-map-root
新建文件package.json{ "name": "nodejs-uglifyjs2", "version": "0.0.1", "description": "uglifyjs2", "author": "Conan Zhang ", "dependencies": { }}
4.执行npm install uglify-js --save下载UglifyJS2依赖包
5.安装完成后
新建test.js开始测试var UglifyJS = require(’uglify-js’);//代码压缩var result = UglifyJS.minify("var b = function () {};", {fromString: true});console.log("\n===========================");console.log(result);//文件压缩result = UglifyJS.minify();console.log("\n===========================");console.log(result.code);//多文件压缩,指定source map和网站来源result = UglifyJS.minify(,{ outSourceMap: "out.js.map", sourceRoot: "http://onbook.me", mangle:true});console.log("\n===========================");console.log(result.code);console.log(result.map);
http://blog.fens.me/nodejs-uglifyjs2-js/
更多文章:
intuitive(intuitive和instinctive的区别)
2024年5月14日 01:21
中国卡车模拟6遨游中国2(遨游中国2怎么自己设置起点和终点)
2024年9月30日 12:02
csol战术飞刀怎么样 威力 距离如何 值得买吗?csol战术飞刀大概多少钱 韩服卖51RMB的国服大概多少
2024年2月20日 17:40
snapchat特效相机(snapchat相机特效加载黑屏)
2024年8月8日 17:25
手机qq2011老版本(手机QQ2011版本为什么老是卡机)
2024年8月20日 21:55
可以赚钱并提现到微信的游戏(挣钱游戏软件一天赚100微信提现没有广告)
2024年6月23日 13:09
oa办公系统怎么注册(怎么样在手机上登录公司的OA办公系统)
2024年10月17日 09:55