原生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 相关文章推荐
Struts2的s:radio标签使用及用jquery添加change事件
Apr 08 Javascript
JavaScript生成GUID的多种算法小结
Aug 18 Javascript
深入理解JavaScript系列(26):设计模式之构造函数模式详解
Mar 03 Javascript
js实现精确到毫秒的倒计时效果
Aug 05 Javascript
BootStrap表单控件之复选框checkbox和单选择按钮radio
May 23 Javascript
微信小程序动态显示项目倒计时
Jun 20 Javascript
实现一个 Vue 吸顶锚点组件方法
Jul 10 Javascript
vue项目中全局引入1个.scss文件的问题解决
Aug 01 Javascript
js中的this的指向问题详解
Aug 29 Javascript
vue+element tabs选项卡分页效果
Jun 29 Javascript
JavaScript实现随机五位数验证码
Sep 27 Javascript
Vue 3.0中jsx语法的使用
Nov 13 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 简单数组排序实现代码
2009/08/05 PHP
ajax php传递和接收变量实现思路及代码
2012/12/19 PHP
laravel 5 实现模板主题功能
2015/03/02 PHP
IE6/7/8中Option元素未设value时Select将获取空字符串
2011/04/07 Javascript
jQuery 网易相册鼠标移动显示隐藏效果实现代码
2013/03/31 Javascript
jQuery菜单插件superfish使用指南
2015/04/21 Javascript
JavaScript中setFullYear()方法的使用详解
2015/06/11 Javascript
简述jQuery ajax的执行顺序
2016/01/05 Javascript
jQuery ajax调用后台aspx后台文件的两种常见方法(不是ashx)
2016/06/28 Javascript
jQuery简单实现MD5加密的方法
2017/03/03 Javascript
angular2+node.js express打包部署的实战
2017/07/27 Javascript
详解基于webpack2.x的vue2.x的多页面站点
2017/08/21 Javascript
Node.js调用fs.renameSync报错(Error: EXDEV, cross-device link not permitted)
2017/12/27 Javascript
在 webpack 中使用 ECharts的实例详解
2018/02/05 Javascript
vue使用原生js实现滚动页面跟踪导航高亮的示例代码
2018/10/25 Javascript
axios携带cookie配置详解(axios+koa)
2018/12/28 Javascript
layui固定下拉框的显示条数(有滚动条)的方法
2019/09/10 Javascript
webpack的 rquire.context用法实现工程自动化的方法
2020/02/07 Javascript
Vuex实现简单购物车
2021/01/10 Vue.js
[03:14]DOTA2斧王 英雄基础教程
2013/11/26 DOTA
[02:42]完美大师赛主赛事淘汰赛第三日观众采访
2017/11/25 DOTA
bat和python批量重命名文件的实现代码
2016/05/19 Python
Python爬虫实现简单的爬取有道翻译功能示例
2018/07/13 Python
详解如何在Apache中运行Python WSGI应用
2019/01/02 Python
Python+Pyqt实现简单GUI电子时钟
2021/02/22 Python
python实现复制文件到指定目录
2019/10/16 Python
浅谈tensorflow之内存暴涨问题
2020/02/05 Python
Python3 中sorted() 函数的用法
2020/03/24 Python
为什么是 Python -m
2020/06/19 Python
解决Python 写文件报错TypeError的问题
2020/10/23 Python
CSS3实现王者匹配时的粒子动画效果
2019/04/12 HTML / CSS
学校党的群众路线教育实践活动制度建设计划
2014/11/03 职场文书
英语辞职信范文
2015/02/28 职场文书
庆七一活动简报
2015/07/20 职场文书
小学二年级班主任工作经验交流材料
2015/11/02 职场文书
python爬取网页版QQ空间,生成各类图表
2021/06/02 Python