原生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事件实例详解
Nov 06 Javascript
JQuery实现绚丽的横向下拉菜单
Dec 19 Javascript
Jquery zTree 树控件异步加载操作
Feb 25 Javascript
Jquery Easyui验证组件ValidateBox使用详解(20)
Dec 18 Javascript
JS中with的替代方法与String中的正则方法详解
Dec 23 Javascript
微信小程序五星评分效果实现代码
Apr 06 Javascript
JavaScript之DOM_动力节点Java学院整理
Jul 03 Javascript
Vue入门之数据绑定(小结)
Jan 08 Javascript
Vue CLI3创建项目部署到Tomcat 使用ngrok映射到外网
May 16 Javascript
Node.js 路由的实现方法
Jun 05 Javascript
vue中的双向数据绑定原理与常见操作技巧详解
Mar 16 Javascript
vue 自定义组件添加原生事件
Apr 21 Vue.js
详解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 数组的指针操作实现代码
2011/02/08 PHP
如何阻止网站被恶意反向代理访问(防网站镜像)
2014/03/18 PHP
destoon找回管理员密码的方法
2014/06/21 PHP
PHP图片处理之图片背景、画布操作
2014/11/19 PHP
THINKPHP支持YAML配置文件的设置方法
2015/03/17 PHP
抛弃 PHP 代价太高
2016/04/26 PHP
php 实现301重定向跳转实例代码
2016/07/18 PHP
php 后端实现JWT认证方法示例
2018/09/04 PHP
PHP通过文件路径获取文件名的实例代码
2018/10/14 PHP
广告代码静态化js通用函数
2007/05/09 Javascript
jquery.qrcode在线生成二维码使用示例
2013/08/21 Javascript
JavaScript表单通过正则表达式验证电话号码
2014/03/14 Javascript
js中数组排序sort方法的原理分析
2014/11/20 Javascript
jQuery实现简单下拉导航效果
2015/09/07 Javascript
jQuery的promise与deferred对象在异步回调中的作用
2016/05/03 Javascript
JS正则表达式验证账号、手机号、电话和邮箱是否合法
2017/03/08 Javascript
jquery获取transform里的值实现方法
2017/12/12 jQuery
Vue递归组件+Vuex开发树形组件Tree--递归组件的简单实现
2019/04/01 Javascript
js 递归json树实现根据子id查父id的方法分析
2019/11/08 Javascript
[01:21]DOTA2新纪元-7.0新版本即将开启!
2016/12/11 DOTA
Python爬虫将爬取的图片写入world文档的方法
2018/11/07 Python
PyQt5显示GIF图片的方法
2019/06/17 Python
安装Pycharm2019以及配置anconda教程的方法步骤
2019/11/11 Python
Python 之 Json序列化嵌套类方式
2020/02/27 Python
python爬虫用mongodb的理由
2020/07/28 Python
python中random.randint和random.randrange的区别详解
2020/09/20 Python
Trunki英国官网:儿童坐骑式行李箱
2017/05/30 全球购物
TripAdvisor越南:全球领先的旅游网站
2017/09/21 全球购物
自我鉴定书面格式
2014/01/13 职场文书
婚前财产公证书
2014/04/10 职场文书
优质护理服务演讲稿
2014/05/07 职场文书
带刀到教室的检讨书
2014/10/04 职场文书
学术研讨会欢迎词
2015/01/26 职场文书
工作年限证明模板
2015/06/15 职场文书
2015年六年级班主任工作总结
2015/10/15 职场文书
如何打开Win11系统注册表编辑器?Win11注册表编辑器打开修复方法
2022/04/05 数码科技