• JavaScript 二、eval 和 with 函数


    /*
    * =========================================================
    *
    * JavaScript 词法欺骗
    *
    * 1.欺骗词法作用域,会导致性能下降。
    * 2.引擎在代码中发现了,eval()和 with()函数时,引擎在词法阶段并不知道它们将接收的什么代码,引擎只能简单的假设关于标示符是无效的。
    * 3.在javascript中编译源代码时,其中一步是对代码做大量的优化,当遇到上述两个函数时,引擎只能不做任何代码的优化,这个是降低性能的原因。
    * 4.eval()和 with()函数,都将在运行时起到作用。
    *
    * =========================================================
    * */

    // function foo(str, a) {
    // eval(str); // 欺骗词法
    // console.log(a, b); // 1 3
    // }
    //
    // var b = 2;
    //
    // foo("var b = 3;", 1);

    //
    // var obj = {
    // a: 1,
    // b: 2,
    // c: 3
    // };
    //
    // console.log(obj.a);
    // console.log(obj.b);
    // console.log(obj.c);

    // with 通常被当作重复引用同一个对象中的多个属性的快捷方式。
    // 但不推荐使用,因会改变当前作用域,降低性能,并且可能造成变量泄漏。
    // 不用循环的重复的调用对象本身。
    // with (obj) {
    // a = 3;
    // b = 4;
    // c = 5;
    // }
    //
    // console.log(obj.a);
    // console.log(obj.b);
    // console.log(obj.c);


    // with
    // 首先我们知道a = 2; 是一个赋值操作(LHS)。当foo传入一个引用(obj),with会改变该
    // 引用作用域中的a属性值,当在该引用查找不到a变量时,作用域查找方式起到作用,向上层作用域执行查找a变量
    // 在该引用作用域、foo作用域、全局作用域中,都没有找到a变量时,with 就自动创建了一个全局变量(如果在上述作用域中查找到a变量将会改变其变量值),
    // 这也叫做变量泄漏,造成这个原因是a=2 执行的时赋值操作,根据javascript中的特性,赋值操作前没有见变量声明标示符时,javascript就自动创建一个全局变量。
    // 前提是非严格模式下,才会产生以上内容,严格模式下,将完全禁止使用with函数。
    // with 实际上是根据你传递给它的对象引用,凭空的创建出一个全新的词法作用域。

    // var a = 10; // 这里可以验证with更改了a变量的值。如果没有定义这个变量,console.log( a );打印的也是2.
    // function foo(obj) {
    // with (obj) {
    // a = 2; // 完全等于赋值操作
    // }
    // }
    // var o1 = {a: 3};
    // var o2 = {b: 3};
    // foo(o1);
    // console.log(o1.a); // 2
    //
    // foo( o2 );
    // console.log( o2.a ); // undefined
    // console.log( a ); // 2——不好,a 被泄漏到全局作用域上了!
  • 相关阅读:
    python核心编程第五章练习-5.17-随机序列
    python核心编程第五章练习-5.11-最大公约数和最小公倍数
    微信机器人之PC微信hook
    PC微信获取登录二维码
    PC微信读取微信好友列表(联系人)
    验证码识别之二值化
    基于决策树的简单验证码识别
    基于朴素贝叶斯识别简单验证码
    PIL库的简单操作
    knn识别简单验证码
  • 原文地址:https://www.cnblogs.com/zero-zf/p/6833454.html
Copyright © 2020-2023  润新知