原生JS中应该禁止出现的写法


Posted in Javascript onMay 05, 2021

块级函数

严格模式下,在 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

以上就是原生JS中应该禁止出现的写法的详细内容,更多关于原生JS中应该禁止的写法的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
javascript 命名规则 变量命名规则
Feb 25 Javascript
js菜单点击显示或隐藏效果的简单实例
Jan 13 Javascript
JS使用正则表达式除去字符串中重复字符的方法
Nov 05 Javascript
jQuery获取单击节点对象的方法
Jun 02 Javascript
AngularJS实现Input格式化的方法
Nov 07 Javascript
easyui form validate总是返回false的原因及解决方法
Nov 07 Javascript
深入学习jQuery中的data()
Dec 22 Javascript
jQuery实现的简单拖动层示例
Feb 22 Javascript
防止页面url缓存中ajax中post请求的处理方法
Oct 10 Javascript
AngularJS实现表单验证功能详解
Oct 12 Javascript
如何在Vue中使用CleaveJS格式化你的输入内容
Dec 14 Javascript
基于JS正则表达式实现模板数据动态渲染(实现思路详解)
Mar 07 Javascript
详解Javascript实践中的命令模式
如何制作自己的原生JavaScript路由
May 05 #Javascript
Vue项目中如何封装axios(统一管理http请求)
May 02 #Vue.js
如何用JavaScript学习算法复杂度
JS不要再到处使用绝对等于运算符了
Apr 30 #Javascript
如何用Node.js编写内存效率高的应用程序
用几道面试题来看JavaScript执行机制
Apr 30 #Javascript
You might like
getJSON跨域SyntaxError问题分析
2014/08/07 PHP
PHP的Trait机制原理与用法分析
2019/10/18 PHP
用js设置下拉框为只读的小技巧
2014/04/10 Javascript
NodeJS Web应用监听sock文件实例
2015/02/18 NodeJs
JavaScript中Number.MIN_VALUE属性的使用示例
2015/06/04 Javascript
基于JQuery实现图片轮播效果(焦点图)
2016/02/02 Javascript
原生javascript实现文件异步上传的实例讲解
2017/10/26 Javascript
利用vue和element-ui设置表格内容分页的实例
2018/03/02 Javascript
父组件中vuex方法更新state子组件不能及时更新并渲染的完美解决方法
2018/04/25 Javascript
Node.js模拟发起http请求从异步转同步的5种用法
2018/09/26 Javascript
利用JavaScript缓存远程窃取Wi-Fi密码的思路详解
2018/11/05 Javascript
OpenLayers3实现对地图的基本操作
2020/09/28 Javascript
python实现将元祖转换成数组的方法
2015/05/04 Python
Python中死锁的形成示例及死锁情况的防止
2016/06/14 Python
Python书单 不将就
2017/07/11 Python
Python爬虫文件下载图文教程
2018/12/23 Python
Python实现的多进程拷贝文件并显示百分比功能示例
2019/04/09 Python
Python3 串口接收与发送16进制数据包的实例
2019/06/12 Python
浅谈pyqt5在QMainWindow中布局的问题
2019/06/21 Python
python for和else语句趣谈
2019/07/02 Python
在django-xadmin中APScheduler的启动初始化实例
2019/11/15 Python
python迭代器常见用法实例分析
2019/11/22 Python
四年级下册教学反思
2014/02/01 职场文书
《落花生》教学反思
2014/02/25 职场文书
助理政工师申报材料
2014/06/03 职场文书
生活部的活动方案
2014/08/19 职场文书
社区党的群众路线教育实践活动剖析材料
2014/10/09 职场文书
兼职安全员岗位职责
2015/02/15 职场文书
2015应届毕业生自荐信范文
2015/03/05 职场文书
2015年度残疾人工作总结
2015/05/14 职场文书
办公经费申请报告
2015/05/15 职场文书
美容院管理规章制度
2015/08/05 职场文书
党校团干班培训心得体会
2016/01/06 职场文书
Spring Boot 启动、停止、重启、状态脚本
2021/06/26 Java/Android
使用 Apache Superset 可视化 ClickHouse 数据的两种方法
2021/07/07 Servers
利用 Python 的 Pandas和 NumPy 库来清理数据
2022/04/13 Python