zoukankan      html  css  js  c++  java
  • 原生 js 中应该禁止出现的写法,以提高代码效率和安全性

    块级函数

    严格模式下,在 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();

    广州VI设计公司https://www.houdianzi.com

    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
  • 相关阅读:
    关于同时上传多个图片的类(有点粗糙)
    关于上传图片的类(有点粗糙)
    关于分页的类(有点粗糙)
    php是什么
    关于glod方法的使用和介绍
    PHP中从数据库获取查询结果时容易出的错误及原因(smarty)
    转载- 支持Android4.0以下webp的使用
    Android用户体验
    转载-Android数据库高手秘籍(一)——SQLite命令
    转载 -安卓开发-Activity中finish() onDestroy() 和System.exit()的区别
  • 原文地址:https://www.cnblogs.com/qianxiaox/p/14017462.html
Copyright © 2011-2022 走看看