原生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 26 Javascript
jQuery实现当前页面标签高亮显示的方法
Mar 10 Javascript
JavaScript实现自动变换表格边框颜色
May 08 Javascript
基于jQuery实现仿搜狐辩论投票动画代码(附源码下载)
Feb 18 Javascript
AngularJS入门教程之迭代器过滤详解
Aug 18 Javascript
js基础之DOM中元素对象的属性方法详解
Oct 28 Javascript
jquery uploadify隐藏上传进度的实现方法
Feb 06 Javascript
jQuery点击头像上传并预览图片
Feb 23 Javascript
Vue.js递归组件构建树形菜单
Dec 24 Javascript
Vue三种常用传值示例(父传子、子传父、非父子)
Jul 24 Javascript
node.js爬取中关村的在线电瓶车信息
Nov 13 Javascript
微信小程序select下拉框实现效果
May 15 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
如何使用Gitblog和Markdown建自己的博客
2015/07/31 PHP
大家都应该掌握的PHP关联数组使用技巧
2015/12/25 PHP
Laravel中Trait的用法实例详解
2016/03/16 PHP
php 使用mpdf实现指定字段配置字体样式的方法
2019/07/29 PHP
jQuery中绑定事件的命名空间详解
2011/04/05 Javascript
jquery 使用点滴函数代码
2011/05/20 Javascript
jQuery UI Autocomplete 1.8.16 中文输入修正代码
2012/04/16 Javascript
一个简单的Node.js异步操作管理器分享
2014/04/29 Javascript
JavaScript设置获取和设置属性的方法
2015/03/04 Javascript
JavaScript使用indexOf获得子字符串在字符串中位置的方法
2015/04/06 Javascript
jQuery事件绑定用法详解(附bind和live的区别)
2016/01/19 Javascript
基于zepto的移动端轻量级日期插件--date_picker
2016/03/04 Javascript
Select下拉框模糊查询功能实现代码
2016/07/22 Javascript
AngularJS动态生成div的ID源码解析
2016/08/29 Javascript
微信小程序 教程之wxapp视图容器 scroll-view
2016/10/19 Javascript
快速理解 JavaScript 中的 LHS 和 RHS 查询的用法
2017/08/24 Javascript
微信小程序自定义组件传值 页面和组件相互传数据操作示例
2019/05/05 Javascript
解决vue中el-tab-pane切换的问题
2020/07/19 Javascript
Vue中computed和watch有哪些区别
2020/12/19 Vue.js
如何封装Vue Element的table表格组件
2021/02/06 Vue.js
[54:26]完美世界DOTA2联赛PWL S3 Forest vs Rebirth 第一场 12.10
2020/12/12 DOTA
python中偏函数partial用法实例分析
2015/07/08 Python
Python爬豆瓣电影实例
2018/02/23 Python
对Python中type打开文件的方式介绍
2018/04/28 Python
在pycharm创建scrapy项目的实现步骤
2020/12/01 Python
selenium+python自动化78-autoit参数化与批量上传功能的实现
2021/03/04 Python
HTML5 图片悬停放大的实现代码示例
2019/12/04 HTML / CSS
优秀党支部事迹材料
2014/01/14 职场文书
安全例会汇报材料
2014/08/23 职场文书
物流管理专业推荐信
2014/09/06 职场文书
银行竞聘报告范文
2014/11/06 职场文书
员工家属慰问信
2015/03/24 职场文书
创业计划书之小型广告公司
2019/10/22 职场文书
解决使用了nginx获取IP地址都是127.0.0.1 的问题
2021/09/25 Servers
《仙剑客栈2》第一弹正式宣传片公开 年内发售
2022/04/07 其他游戏
详解Android中的TimePickerView(时间选择器)的用法
2022/04/30 Java/Android