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
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
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
2
3
4
5
6
7
8
9
10
在开发中,不要使用eval,缺点:
- 可读性非常差
- 本质是字符串,在执行过程中,可能会被恶意篡改,有被攻击的风险
- eval执行的代码并不会被JS引擎优化
# 3. 严格模式
JS刚设计出来时,非常灵活,有非常多的不足,在ES5中,提出了严格模式,默认情况下,代码执行时,并不是严格模式,要使用严格模式,需要开启严格模式。
在哪开启:
- 在一个JS文件中开启 “use strict” 这个文件中写的代码都受严格模式的约束
- 在一个函数中开启格式模式 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
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
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
2
3
4
5
6
7
// 4)不能使用with语句
let obj = {
msg: "hello"
}
with(obj) {
console.log(msg);
}
1
2
3
4
5
6
7
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
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
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
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
2
3
4
5
6
7
8
9
10
11
12
13