原生JS中应该禁止出现的写法
作者:浅笑· 时间:2024-04-10 11:00:49
块级函数
严格模式下,在 ES6 之前应禁止使用。ES6 开始可以使用,函数的作用域为声明该函数的块内部。非严格模式下应禁止使用。
if(true) {
function test() { //块级函数
console.log(1);
}
}
test();
直接修改对象的 prototype 原型
浏览器对原型进行了优化,在调用实例之前,会为对象的方法提前规划内存位置。所以不可以直接修改 prototype 原型。以下两种方法都应禁止使用
使用 Object.setPrototypeOf 修改原型
function a(){}
a.prototype = {
a_prop: "a val"
};
function b(){}
var proto = {
b_prop: "b val"
};
Object.setPrototypeOf(
proto, a.prototype
);
b.prototype = proto;
var test = new b;
console.log(test.a_prop); // a val
console.log(test.b_prop); // b val
直接修改对象的 __proto__ 属性
function a(){}
a.prototype = {
a_prop: "a val"
};
function b(){}
var proto = {
b_prop: "b val",
__proto__: a.prototype //直接修改 b 对象的 __prototype__ 属性
};
b.prototype = proto;
var test = new b;
console.log(test.a_prop); // a val
console.log(test.b_prop); // b val
with
with 的用法:
var a = {
p1: 1,
p2: 2
}
with (a) {
p1 = 3;
}
console.log(a.p1);
应该禁止使用 with,例如:
function a(arg1, arg2) {
with (arg2){
console.log(arg1); // 无法确定是要输出第一个参数还是要输出 arg2 的 arg1 属性
}
}
var arg2 = {arg1:1}
a("arg1", arg2)
callee
arguments.callee 表示当前正在执行的函数:
function a(arg1) {
if (arg1 > 1) {
return arg1 * arguments.callee(arg1 - 1);
}
else {
return 1;
}
}
console.log(a(3)); // 6
当一个函数必须调用自身的时候, 应禁止使用arguments.callee(),直接通过函数名字调用该函数。
function a(arg1) {
if (arg1 > 1) {
return arg1 * a(arg1 - 1); // 直接通过函数名称调用
}
else {
return 1;
}
}
console.log(a(3)); // 6
caller
caller 表示函数的调用者,应禁止使用,该特性不是标准的。
function a() {
console.log(a.caller); // function b() { a(); }
}
function b() {
a();
}
b();
eval
eval() 可以把传入的字符串参数当成JavaScript代码执行。
eval("var a = 1, b = 2; console.log(a+b)"); // 3
禁止使用 eval。eval 比一般JavaScript执行要慢,因为浏览器对 javascript 进行了优化。eval 方法也不安全,因为它使用与调用者相同的权限执行代码,而且 eval() 被调用时,它的作用域也会暴露。应该用 Function 代替:
var a = new Function("a", "b", "console.log(a+b)")
a(1,2); // 3
来源:https://www.cnblogs.com/qianxiaox/p/14017462.html
标签:JS,效率,安全
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
python moviepy 的用法入门篇
2022-09-03 11:41:16
![](https://img.aspxhome.com/file/2023/5/131325_0s.png)
Python实现自定义异常堆栈信息的示例代码
2021-10-29 14:27:47
![](https://img.aspxhome.com/file/2023/1/101221_0s.jpg)
Python向Excel中插入图片的简单实现方法
2022-09-27 21:41:59
![](https://img.aspxhome.com/file/2023/4/66434_0s.png)
讲解MySQL数据库字符集出错的解决方法
2008-12-02 14:32:00
Git标签管理
2022-02-01 18:53:06
![](https://img.aspxhome.com/file/2023/5/120515_0s.png)
Python音乐爬虫完美绕过反爬
2022-12-30 06:53:45
![](https://img.aspxhome.com/file/2023/5/89215_0s.png)
通过js获取div的background-image属性
2023-08-23 06:07:23
一文看懂JSONP原理和应用
2024-04-23 09:10:47
![](https://img.aspxhome.com/file/2023/1/135681_0s.png)
Python使用smtp和pop简单收发邮件完整实例
2022-01-07 05:48:40
Python中return用法案例详解
2022-09-09 10:35:40
解决jupyter notebook import error但是命令提示符import正常的问题
2022-08-19 22:10:30
SQL Server 服务器优化技巧浅谈
2024-01-13 17:31:01
Django3基于WebSocket实现WebShell的详细过程
2021-12-01 21:34:31
Redux saga异步管理与生成器详解
2023-07-24 02:53:52
![](https://img.aspxhome.com/file/2023/9/55999_0s.png)
python matplotlib如何给图中的点加标签
2023-02-23 12:16:47
![](https://img.aspxhome.com/file/2023/9/97009_0s.png)
python网络爬虫之如何伪装逃过反爬虫程序的方法
2022-08-12 10:23:23
对Python字符串中的换行符和制表符介绍
2021-11-11 15:45:29
2行Python实现给图片加水印效果
2021-09-29 11:15:13
![](https://img.aspxhome.com/file/2023/1/104981_0s.jpg)
MYSQL的select 学习笔记
2024-01-21 17:48:50
C#创建数据库及导入sql脚本的方法
2024-01-23 04:08:04