原生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+FSO遍历文件夹下文件并显示
Mar 07 Javascript
在html页面中包含共享页面的方法
Oct 24 Javascript
JS实现的一个简单的Autocomplete自动完成例子
Apr 16 Javascript
js子页面获取父页面数据示例
May 15 Javascript
Angular.js如何从PHP读取后台数据
Mar 24 Javascript
Node.js返回JSONP详解
May 18 Javascript
文件上传插件SWFUpload的使用指南
Nov 29 Javascript
EasyUI的DataGrid每行数据添加操作按钮的实现代码
Aug 22 Javascript
基于twbsPagination.js分页插件使用心得(分享)
Oct 21 Javascript
使用vue根据状态添加列表数据和删除列表数据的实例
Sep 29 Javascript
Vue批量图片显示时遇到的路径被解析问题
Mar 28 Javascript
js实现图片跟随鼠标移动效果
Oct 16 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生成自己的LOG文件
2006/10/09 PHP
PHP中使用smarty生成静态文件的例子
2014/04/24 PHP
PHP和Shell实现检查SAMBA与NFS Server是否存在
2015/01/07 PHP
关于PhpStorm设置点击编辑文件自动定位源文件的实现方式
2020/12/30 PHP
jQuery版仿Path菜单效果
2011/12/15 Javascript
20个最新的jQuery插件
2012/01/13 Javascript
原生js操作checkbox用document.getElementById实现
2013/10/12 Javascript
用JS在浏览器中创建下载文件
2014/03/05 Javascript
jQuery使用andSelf()来包含之前的选择集
2014/05/19 Javascript
jQuery中noconflict函数的实现原理分解
2015/02/03 Javascript
JavaScript判断是否为数组的3种方法及效率比较
2015/04/01 Javascript
JavaScript实现仿网易通行证表单验证
2015/05/25 Javascript
JavaScript中toString()方法的使用详解
2015/06/05 Javascript
javascript中判断json的方法总结
2015/08/27 Javascript
对jquery的ajax进行二次封装以及ajax缓存代理组件:AjaxCache详解
2016/04/11 Javascript
详解用webpack2搭建angular2的项目
2017/06/22 Javascript
Angular中的interceptors拦截器
2017/06/25 Javascript
input框中自动展示当前日期yyyy/mm/dd的实现方法
2017/07/06 Javascript
基于jQuery的左滑出现删除按钮的示例
2017/08/29 jQuery
解决vue打包项目后刷新404的问题
2018/03/06 Javascript
vue+element-ui+ajax实现一个表格的实例
2018/03/09 Javascript
vue iview实现动态路由和权限验证功能
2018/04/17 Javascript
微信小程序 WXML节点信息查询详解
2019/07/29 Javascript
[28:05]完美世界DOTA2联赛循环赛Inki vs DeMonsTer 第一场 10月30日
2020/10/31 DOTA
一个简单的python程序实例(通讯录)
2013/11/29 Python
python标准算法实现数组全排列的方法
2015/03/17 Python
详解Python中第三方库Faker
2020/09/25 Python
html5将图片转换成base64的实例代码
2016/09/21 HTML / CSS
美国隐形眼镜销售网站:ContactsDirect
2017/10/28 全球购物
琳达·法罗眼镜英国官网:Linda Farrow英国
2021/01/19 全球购物
实习销售业务员自我鉴定
2013/09/21 职场文书
青年创业培训欢迎词
2014/01/10 职场文书
领导检查欢迎词
2014/01/14 职场文书
三分钟演讲稿范文
2014/04/24 职场文书
Python道路车道线检测的实现
2021/06/27 Python
vue/cli 配置动态代理无需重启服务的方法
2022/05/20 Vue.js