原生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事件处理器中的event参数使用介绍
May 24 Javascript
JQuery的$命名冲突详细解析
Dec 28 Javascript
javascript中call,apply,bind的用法对比分析
Feb 12 Javascript
prototype框架中美元符号$用法分析
Jan 22 Javascript
AngularJS基于ngInfiniteScroll实现下拉滚动加载的方法
Dec 14 Javascript
基于express中路由规则及获取请求参数的方法
Mar 12 Javascript
Vue.js子组件向父组件通信的方法实例代码详解
Dec 10 Javascript
vue-router重定向和路由别名的使用讲解
Jan 19 Javascript
新手快速入门微信小程序组件库 iView Weapp
Jun 24 Javascript
微信小程序自定义单项选择器样式
Jul 25 Javascript
Vue-CLI 项目在pycharm中配置方法
Aug 30 Javascript
VUEX-action可以修改state吗
Nov 19 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开发模式(简写版)
2007/03/15 PHP
PHP记录搜索引擎蜘蛛访问网站足迹的方法
2015/04/15 PHP
PHP命名空间和自动加载类
2016/04/03 PHP
jquery可见性过滤选择器使用示例
2013/06/24 Javascript
jquery 列表双向选择器之改进版
2013/08/09 Javascript
js自动生成的元素与页面原有元素发生堆叠的解决方法
2013/10/24 Javascript
js中的replace方法使用介绍
2013/10/28 Javascript
js中substr,substring,indexOf,lastIndexOf的用法小结
2013/12/27 Javascript
用jQuery实现的智能隐藏、滑动效果的返回顶部代码
2014/03/18 Javascript
JQuery对表格进行操作的常用技巧总结
2014/04/23 Javascript
React学习笔记之高阶组件应用
2018/06/02 Javascript
微信小程序自定义可滑动顶部TabBar选项卡实现页面切换功能示例
2019/05/14 Javascript
微信小程序-API接口安全详解
2019/07/16 Javascript
原生JavaScript实现五子棋游戏
2020/11/09 Javascript
Python 序列化 pickle/cPickle模块使用介绍
2014/11/30 Python
解析Python中的二进制位运算符
2015/05/13 Python
详解Python验证码识别
2016/01/25 Python
python多线程方式执行多个bat代码
2016/06/07 Python
Python内置函数OCT详解
2016/11/09 Python
python抓取文件夹的所有文件
2018/02/27 Python
对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解
2018/06/28 Python
python 划分数据集为训练集和测试集的方法
2018/12/11 Python
TensorFlow索引与切片的实现方法
2019/11/20 Python
pytorch实现从本地加载 .pth 格式模型
2020/02/14 Python
Python将二维列表list的数据输出(TXT,Excel)
2020/04/23 Python
Python 开发工具通过 agent 代理使用的方法
2020/09/27 Python
使用python-cv2实现Harr+Adaboost人脸识别的示例
2020/10/27 Python
广州迈达威.net面试题目
2012/03/10 面试题
介绍一下HDLC(High-Level Data Link Control)高层数据链路协议
2012/01/21 面试题
企业仓管员岗位职责
2014/06/15 职场文书
党员学习正风肃纪思想汇报
2014/09/12 职场文书
2014年环境整治工作总结
2014/12/10 职场文书
担保书格式
2015/01/20 职场文书
单位病假条范文
2015/08/17 职场文书
解决Swagger2返回map复杂结构不能解析的问题
2021/07/02 Java/Android
Python绘制散点图之可视化神器pyecharts
2022/07/07 Python