原生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 相关文章推荐
JS 文件大小判断的实现代码
Apr 07 Javascript
jquery动态加载js三种方法实例
Aug 03 Javascript
JS 毫秒转时间示例代码
Sep 22 Javascript
JavaScript代码性能优化总结篇
May 15 Javascript
JS实现批量上传文件并显示进度功能
Jun 27 Javascript
JS实现标签滚动切换效果
Dec 25 Javascript
浅谈webpack打包之后的文件过大的解决方法
Mar 07 Javascript
AngularJS实现的base64编码与解码功能示例
May 17 Javascript
d3.js实现自定义多y轴折线图的示例代码
May 30 Javascript
使用D3.js+Vue实现一个简单的柱形图
Aug 05 Javascript
详解webpack自定义loader初探
Aug 29 Javascript
OpenLayers3实现鼠标移动显示坐标
Sep 25 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
解析PHP可变函数的经典用法
2013/06/20 PHP
php获取apk包信息的方法
2014/08/15 PHP
thinkphp3.x中display方法及show方法的用法实例
2016/05/19 PHP
thinkphp的dump函数无输出实例代码
2016/11/15 PHP
PHP获取真实客户端的真实IP
2017/03/07 PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
2017/08/28 PHP
php微信开发之关注事件
2018/06/14 PHP
javascript 定义初始化数组函数
2009/09/07 Javascript
3分钟写出来的Jquery版checkbox全选反选功能
2013/10/23 Javascript
jQuery实现的一个tab切换效果内部还嵌有切换
2014/08/10 Javascript
JQuery右键菜单插件ContextMenu使用指南
2014/12/19 Javascript
快速解决jquery.touchSwipe左右滑动和垂直滚动条冲突
2016/04/15 Javascript
ES6新特性之类(Class)和继承(Extends)相关概念与用法分析
2017/05/24 Javascript
微信小程序数据存储与取值详解
2018/01/30 Javascript
详解mpvue小程序中怎么引入iconfont字体图标
2018/10/01 Javascript
vue实现div可拖动位置也可改变盒子大小的原理
2020/09/16 Javascript
vue下载二进制流图片操作
2020/10/26 Javascript
Python中的jquery PyQuery库使用小结
2014/05/13 Python
ubuntu17.4下为python和python3装上pip的方法
2018/06/12 Python
在Python 字典中一键对应多个值的实例
2019/02/03 Python
Python 监测文件是否更新的方法
2019/06/10 Python
Django中的静态文件管理过程解析
2019/08/01 Python
pytorch对梯度进行可视化进行梯度检查教程
2020/02/04 Python
使用jupyter notebook将文件保存为Markdown,HTML等文件格式
2020/04/14 Python
浅谈keras2 predict和fit_generator的坑
2020/06/17 Python
为什么python比较流行
2020/06/19 Python
Python+OpenCV图像处理——实现直线检测
2020/10/23 Python
Speedo美国:澳大利亚顶尖泳衣制造商
2016/08/03 全球购物
ShellScript面试题一则-ShellScript编程
2014/03/05 面试题
语文教育专业推荐信范文
2013/11/25 职场文书
八一建军节部队活动方案
2014/02/04 职场文书
剪枝的学问教学反思
2014/02/07 职场文书
先进个人申报材料
2014/12/30 职场文书
初中语文教学反思范文
2016/03/03 职场文书
高效笔记技巧分享:学会这些让你不再困扰
2019/09/04 职场文书
html+css 实现简易导航栏功能
2021/04/07 HTML / CSS