原生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中获取下个月一号,是星期几
Jun 01 Javascript
javascript获取URL参数与参数值的示例代码
Dec 20 Javascript
CSS3,HTML5和jQuery搜索框集锦
Dec 02 Javascript
JavaScript控制按钮可用或不可用的方法
Apr 03 Javascript
js jquery获取当前元素的兄弟级 上一个 下一个元素
Sep 01 Javascript
js行号显示的文本框实现效果(兼容多种浏览器 )
Oct 23 Javascript
jQuery Ajax 全局调用封装实例代码详解
Jun 02 Javascript
JavaScript中setter和getter方法介绍
Jul 11 Javascript
使用jQuery实现简单的tab框实例
Aug 22 jQuery
javascript实现弹幕墙效果
Nov 28 Javascript
vue-cli+webpack项目打包到服务器后,ttf字体找不到的解决操作
Aug 28 Javascript
jQuery是用来干什么的 jquery其实就是一个js框架
Feb 04 jQuery
详解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 杂谈《重构-改善既有代码的设计》之三 重新组织数据
2012/04/09 PHP
php格式化日期和时间格式化示例分享
2014/02/24 PHP
迁移PHP版本到PHP7
2015/02/06 PHP
CI框架(ajax分页,全选,反选,不选,批量删除)完整代码详解
2016/11/01 PHP
thinkPHP中钩子的两种配置调用方法详解
2016/11/11 PHP
Yii2中添加全局函数的方法分析
2017/05/04 PHP
php+mysql开发中的经验与常识小结
2019/03/25 PHP
原生JS和JQuery动态添加、删除表格行的方法
2015/05/28 Javascript
详解JavaScript中数组的相关知识
2015/07/29 Javascript
详解JavaScript语言的基本语法要求
2015/11/20 Javascript
前端性能优化及技巧
2016/05/06 Javascript
BootStrap selectpicker
2016/06/20 Javascript
jQuery中show与hide方法用法示例
2016/09/16 Javascript
jQuery实现花式轮播之圣诞节礼物传送效果
2016/12/25 Javascript
漂亮实用的页面loading(加载)封装代码
2017/02/03 Javascript
vue实现表格数据的增删改查
2017/07/10 Javascript
浅谈Angular6的服务和依赖注入
2018/06/27 Javascript
JS在if中的强制类型转换方式
2018/07/15 Javascript
jquery.pagination.js分页使用教程
2018/10/23 jQuery
js中this的指向问题归纳总结
2018/11/28 Javascript
5个你不知道的JavaScript字符串处理库(小结)
2020/06/01 Javascript
Python中实现参数类型检查的简单方法
2015/04/21 Python
python实现简单flappy bird
2018/12/24 Python
解决python3.5 正常安装 却不能直接使用Tkinter包的问题
2019/02/22 Python
django最快程序开发流程详解
2019/07/19 Python
基于python调用psutil模块过程解析
2019/12/20 Python
Keras实现DenseNet结构操作
2020/07/06 Python
编译 pycaffe时报错:fatal error: numpy/arrayobject.h没有那个文件或目录
2020/11/29 Python
python 实现Harris角点检测算法
2020/12/11 Python
CSS3中文字镂空、透明值、阴影效果设置示例小结
2016/03/07 HTML / CSS
洗手间标语
2014/06/23 职场文书
总账会计岗位职责
2015/04/02 职场文书
大学生入党自传2015
2015/06/26 职场文书
婚宴新郎致辞
2015/07/28 职场文书
《落花生》教学反思
2016/02/16 职场文书
mysql幻读详解实例以及解决办法
2022/06/16 MySQL