原生JS中应该禁止出现的写法
作者:浅笑· 发布时间:2024-04-10 11:00:49
标签:JS,效率,安全
块级函数
严格模式下,在 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


猜你喜欢
- 前面我通过一篇文章讲述了如何爬取CSDN的博客摘要等信息。通常,在使用Selenium爬虫爬取数据后,需要存储在TXT文本中,但是这是很难进
- 背景是:在实际开发中,可能会遇到网络问题或者查询量比较大的情况,上一个请求还没有完成,用户就发起了下一个请求。会造成什么情况呢?但是同一个请
- 废话不多说了,直接把我写的timeit函数分享给大家,具体内容如下:/** * Compute the delay to execute a
- 前言PyGame 是一个专门设计来进行游戏开发设计的 Python 模块,允许实时电子游戏研发而无需被低级语言(如机器语言和汇编语言)束缚,
- 1. 信号与槽(Signals and slots)信号与槽机制是 PyQt 的核心机制,用于对象之间的通信,也就是实现函数之间的自动调用。
- 以下是个人对Python深浅拷贝的通俗解释,易于绕开复杂的Python数据结构存储来进行理解!高级语言中变量是对内存及其地址的抽象,Pyth
- 这篇文章主要介绍了基于python实现把图片转换成素描,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋
- 在一些情况下,MySQL可以直接使用索引来满足一个 ORDER BY 或 GROUP BY 子句而无需做额外的排序。尽管 ORDER BY
- 一、概述Oracle Data Provider for .NET, Managed Driver:Oracle官方的托管数据库
- 在JavaScript中,数组本质上是一种特殊的对象,它的类型值会返回 object。如果我们需要比较两个数组是否相等,不能像比较基本类型(
- window对象是JavaScript浏览器对象模型中的顶层对象,包含多个常用方法和属性: 1 打开新窗口 window.open(page
- 前言:学习JavaScript的童鞋都知道,我们在发送网络请求,也就是我们在地址栏输入一个网址,就会自动跳转到当前网址,比如在浏览器网址输入
- Tags# 普通for循环<ul>{% for user in user_list %} <li>{{
- 一种小技巧,可以让python捕获信号量HUP 然后当使用 kill 发起HUP信号量的时候 捕获到进行处理,可以处理为重新读取配置文件并重
- shapefile是GIS中非常重要的一种数据类型,在ArcGIS中被称为要素类(Feature Class),主要包括点(point)、线
- 前言:多线程简单理解就是:一个CPU,也就是单核,将时间切成一片一片的,CPU轮转着去处理一件一件的事情,到了规定的时间片就处理下一件事情。
- 在大多数情况下,攻击者可以通过定位域管理员所登录的服务器,利用漏洞获取服务器system权限,找到域管理的账号、进程或是身份验证令牌,从而获
- 自从SQL Server 2005推出后,因为有了更好的性能,所以有很多与SQL Server 2000相关的应用程序需要升级到这个版本。但
- 作用:调用方法改为调用对象, 比如 : p.set_name() 改为 p.set_name区别:前者改变get方法,后者改变set方法效果
- 1. 随机搜索策略在本节中,我们将学习一种比随机选择动作更复杂的策略来解决 CartPole 问题—