原生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 相关文章推荐
在IE模态窗口中自由查看HTML源码的方法
Mar 08 Javascript
css把超出的部分显示为省略号的方法兼容火狐
Jul 23 Javascript
JQuery 表单中textarea字数限制实现代码
Dec 07 Javascript
qTip 基于JQuery的Tooltip插件[兼容性好]
Sep 01 Javascript
Jquery使用css方法改变样式实例
May 18 Javascript
详解vue+css3做交互特效的方法
Nov 20 Javascript
创建echart多个联动的示例代码
Nov 23 Javascript
浅谈redux, koa, express 中间件实现对比解析
May 23 Javascript
vue柱状进度条图像的完美实现方案
Aug 26 Javascript
Vue 组件复用多次自定义参数操作
Jul 27 Javascript
JS访问对象两种方式区别解析
Aug 29 Javascript
JavaScript 异步时序问题
Nov 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
PHP的一个基础知识 表单提交
2011/07/04 PHP
PHP中文分词的简单实现代码分享
2011/07/17 PHP
PHP快速生成各种信息提示框的方法
2016/02/03 PHP
Laravel实现ORM带条件搜索分页
2019/10/24 PHP
JavaScript基础篇之变量作用域、传值、传址的简单介绍与实例
2013/06/29 Javascript
jQuery点击自身以外地方关闭弹出层的简单实例
2013/12/24 Javascript
jQuery实现页面滚动时动态加载内容的方法
2015/03/20 Javascript
Node.js静态文件服务器改进版
2016/01/10 Javascript
jQuery侧边栏实现代码
2016/05/06 Javascript
解决Mac安装thrift因bison报错的问题
2018/05/17 Javascript
ES6之Proxy的get方法详解
2019/10/11 Javascript
javascript随机变色实例代码
2019/10/15 Javascript
JS+css3实现幻灯片轮播图
2020/08/14 Javascript
vue实现两个组件之间数据共享和修改操作
2020/11/12 Javascript
在Python程序中实现分布式进程的教程
2015/04/28 Python
星球大战与Python之间的那些事
2016/01/07 Python
python3.5 email实现发送邮件功能
2018/05/22 Python
Python 格式化打印json数据方法(展开状态)
2020/02/27 Python
python反编译教程之2048小游戏实例
2021/03/03 Python
HTML5+CSS3 实现灵动的动画 TAB 切换效果(DEMO)
2017/09/15 HTML / CSS
你懂得怎么写自荐信吗?
2013/12/27 职场文书
幼儿园家长评语
2014/02/10 职场文书
写求职信有什么意义
2014/02/17 职场文书
经理助理岗位职责
2014/03/05 职场文书
小学生三分钟演讲稿
2014/08/18 职场文书
2014年安全保卫工作总结
2014/11/13 职场文书
2014年医院工作总结
2014/11/20 职场文书
2015年先进个人自荐书
2015/03/24 职场文书
酒店总经理岗位职责
2015/04/01 职场文书
2015年档案管理员工作总结
2015/05/13 职场文书
死亡诗社观后感
2015/06/05 职场文书
七一表彰大会简报
2015/07/20 职场文书
思品教学工作总结
2015/08/10 职场文书
教你怎么用Python操作MySql数据库
2021/05/31 Python
Python 中的单分派泛函数你真的了解吗
2021/06/22 Python
Golang使用Panic与Recover进行错误捕获
2022/03/22 Golang