原生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实现的分页函数
Dec 22 Javascript
jquery简单体验
Jan 10 Javascript
jQuery插件开发的两种方法及$.fn.extend的详解
Jan 16 Javascript
js中的时间转换—毫秒转换成日期时间的示例代码
Jan 26 Javascript
JavaScript实现带箭头标识的多级下拉菜单效果
Aug 27 Javascript
js实现延时加载Flash的方法
Nov 26 Javascript
jQuery实现右下角可缩放大小的层完整实例
Jun 20 Javascript
Angular JS 生成动态二维码的方法
Feb 23 Javascript
JavaScript闭包的简单应用
Sep 01 Javascript
原生JavaScript实现Ajax异步请求
Nov 19 Javascript
jQuery zTree 异步加载添加子节点重复问题
Nov 29 jQuery
浅谈基于Vue.js的移动组件库cube-ui
Dec 20 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
全国FM电台频率大全 - 13 福建省
2020/03/11 无线电
检查php文件中是否含有bom的函数
2012/05/31 PHP
php常用字符串比较函数实例汇总
2014/11/24 PHP
PHP模块化安装教程
2016/06/01 PHP
php封装的图片(缩略图)处理类完整实例
2016/10/19 PHP
php array_values 返回数组的值实例详解
2016/11/17 PHP
php7 新增功能实例总结
2020/05/25 PHP
ext 代码生成器
2009/08/07 Javascript
纯js分页代码(简洁实用)
2013/11/05 Javascript
原生JavaScript实现瀑布流布局
2020/06/28 Javascript
基于JS实现类似支付宝支付密码输入框
2016/09/02 Javascript
浅谈javascript:两种注释,声明变量,定义函数
2016/10/05 Javascript
js实现页面刷新滚动条位置不变
2016/11/27 Javascript
Jquery遍历筛选数组的几种方法和遍历解析json对象,Map()方法详解以及数组中查询某值是否存在
2019/01/18 jQuery
javascript实现小型区块链功能
2019/04/03 Javascript
Python挑选文件夹里宽大于300图片的方法
2015/03/05 Python
Python内建函数之raw_input()与input()代码解析
2017/10/26 Python
Python实现分段线性插值
2018/12/17 Python
使用python快速在局域网内搭建http传输文件服务的方法
2019/11/14 Python
python 字典套字典或列表的示例
2019/12/16 Python
使用Python的Turtle库绘制森林的实例
2019/12/18 Python
Python获取二维数组的行列数的2种方法
2020/02/11 Python
python图形开发GUI库pyqt5的详细使用方法及各控件的属性与方法
2020/02/14 Python
详解Pycharm出现out of memory的终极解决方法
2020/03/03 Python
伯克斯奥特莱斯:Burkes Outlet
2019/03/30 全球购物
一些Unix笔试题和面试题
2012/09/25 面试题
党校培训思想汇报
2013/12/30 职场文书
求职简历的自我评价
2014/01/31 职场文书
陈欧的广告词
2014/03/18 职场文书
大四优秀党员个人民主评议
2014/09/19 职场文书
干部作风建设个人剖析材料
2014/10/11 职场文书
龙门石窟导游词
2015/02/02 职场文书
结婚仪式主持词
2015/06/29 职场文书
HTML+CSS 实现顶部导航栏菜单制作
2021/06/03 HTML / CSS
javascript的var与let,const之间的区别详解
2022/02/18 Javascript
Python中使用Opencv开发停车位计数器功能
2022/04/04 Python