07-with,eval,严格模式

6/22/2022

# 1. with

作用域链: 一种数据的查找机制。

with语句,作用:扩展一个语句的作用域链。代码如下:

<script>
    let address = "bj";
    let obj = {
        uname: "wc",
        uage: 18
    }
    with(obj) {
        // 找uname    之前:去ECG中找uname  没有
        // 打uage     之前:去ECG中找uage  没有
        // with 扩展了作用域链   现在:找数据,去obj中找
        // 现在:如果obj中没有,还会去ECG中找
        console.log(uname);
        console.log(uage);
        console.log(address);
    }
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<script>
    let msg = "xixi";
    let obj = {
        naem: "wc",
        msg: "haha"
    }

    function foo() {
        let msg = "hehe"

        function bar() {
            let msg = "heihei"
            with(obj) {
                // let msg = "lala"
                console.log(msg);
            }
        }
        bar()
    }
    foo()
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

在开发中,不要使用with,with语句破坏了作用域链,可能会出现一些错误,也有兼容性问题。

# 2. eval

eval是一个特殊的函数,作用:可以把一片字符串,当成JS代码运行。

<script>
    let age = 110;
    var jsStr = " var msg = 'haha'; console.log(msg); console.log(age); ";

    // 可以把上面的字符串当成JS代码运行
    // eval执行代码,并不是沙箱环境,受外界的环境影响
    // 在node中,一个运行JS代码的沙箱环境
    eval(jsStr);
    console.log(msg);
</script>
1
2
3
4
5
6
7
8
9
10

在开发中,不要使用eval,缺点:

  1. 可读性非常差
  2. 本质是字符串,在执行过程中,可能会被恶意篡改,有被攻击的风险
  3. eval执行的代码并不会被JS引擎优化

# 3. 严格模式

JS刚设计出来时,非常灵活,有非常多的不足,在ES5中,提出了严格模式,默认情况下,代码执行时,并不是严格模式,要使用严格模式,需要开启严格模式。

在哪开启:

  1. 在一个JS文件中开启 “use strict” 这个文件中写的代码都受严格模式的约束
  2. 在一个函数中开启格式模式 function fn(){ “use strict” xxx } 其它代码不受约束
"use strict"

// 1)不能使用没有加var的全局变量
name = "wc";
console.log(name);

function foo() {
    age = 18;
    console.log(age);
}
foo();
1
2
3
4
5
6
7
8
9
10
11
// 2)形参不能重名
function fn(x, y, z, x) {
    console.log(x, y, z, x);
}
fn(1, 2, 3, 4)
1
2
3
4
5
// 3)不能使用老的8进制数据的写法
let num1 = 0x123; // 16进制
let num2 = 0o10; // 8进制(新的8进制写法)
let num3 = 010; // 8进制(老的8进制写法)
console.log(num1);
console.log(num2);
console.log(num3);
1
2
3
4
5
6
7
// 4)不能使用with语句
let obj = {
    msg: "hello"
}
with(obj) {
    console.log(msg);
}
1
2
3
4
5
6
7
// 5)在严格模式下,JS串中定义的数据,外界不能使用
// 外界定义的数据,在JS串中还是可以使用
let age = 110;
let jsStr = " 'use strict'; var msg = 'haha'; console.log(age); ";

console.log(msg);
eval(jsStr);
1
2
3
4
5
6
7
// 6)在非严格模式下,this是window  在严格模式下,不会默认绑定,this是und
setTimeout(() => {
    console.log(this);
}, 2000)

function fn() {
    console.log(this);
}

fn();
1
2
3
4
5
6
7
8
9
10
<script>
    function fn() {
        // 在函数内部去开启严格模式
        "use strict";
        a = 110;
        console.log(a);
    }
    fn();
</script>
1
2
3
4
5
6
7
8
9
<script>
    function gn() {
        a = 123;
        console.log(a);
    }

    function fn() {
        // fn内部是严格模式 但是gn内部不是严格模式
        "use strict";
        gn();
    }
    fn();
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
Last Updated: 12/25/2022, 10:02:14 PM