-
Notifications
You must be signed in to change notification settings - Fork 2
/
js严格模式.txt
180 lines (113 loc) · 3.86 KB
/
js严格模式.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
JavaScript Use Strict:"use strict"; 定义 JavaScript 代码应该以“严格模式”执行。
1."use strict" 指令
"use strict" 是 JavaScript 1.8.5 中的新指令(ECMAScript version 5)。
它不算一条语句,而是一段文字表达式,更早版本的 JavaScript 会忽略它。
"use strict"; 的作用是指示 JavaScript 代码应该以“严格模式”执行。
在严格模式中,您无法,例如,使用未声明的变量。
2.声明严格模式
通过在脚本或函数的开头添加 "use strict"; 来声明严格模式。
在脚本开头进行声明,拥有全局作用域(脚本中的所有代码均以严格模式来执行):
实例1:
<!DOCTYPE html>
<html>
<body>
<h1>使用 "use strict":</h1>
<h3>不允许使用变量而不声明它。</h3>
<p>在浏览器中激活调试(F12)以查看错误报告。</p>
<script>
"use strict";
x = 3.14; // 会引发错误(x 未定义), x is not defined
</script>
</body>
</html> // 会引发错误(x 未定义)
实例2:
"use strict";
myFunction();
function myFunction() {
y = 3.14; // 这会引发错误,因为 y 尚未声明, ReferenceError(引用错误):y is not defined
}
例子3:
在函数中声明严格模式,拥有局部作用域(只有函数中的代码以严格模式执行):
x = 3.14; // 这不会引发错误
myFunction();
function myFunction() {
"use strict";
y = 3.14; // 这会引发错误
}
3."use strict"; 语法
声明严格模式的语法被设计为兼容更早版本的 JavaScript。
编译 JavaScript 程序中的数值文字(比如 4+5)或字符串文字("Bill Gates")不会有负面效果。它只会编译为不存在的变量然后消失。
所有 "use strict"; 只会对“理解”其含义的新编译器产生影响。
4.为什么使用严格模式?
严格模式使我们更容易编写“安全的” JavaScript。
严格模式把之前可接受的“坏语法”转变为真实的错误。
举例来说,在普通的 JavaScript 中,错打变量名会创建新的全局变量。在严格模式中,此举将抛出错误,这样就不可能意外创建全局变量。
在普通 JavaScript 中,如果向不可写属性赋值,开发者不会得到任何错误反馈。
在严格模式中,向不可写的、只能读取的、不存在的属性赋值,或者向不存在的变量或对象赋值,将抛出错误。
5.严格模式中不允许的事项
在不声明变量的情况下使用变量,是不允许的:
"use strict";
x = 3.14; // 这将引发错误,x还没有被定义。
6.对象也是变量
在不声明对象的情况下使用对象也是不允许的:
"use strict";
x = {p1:10, p2:20}; // 这将引发错误,x未定义
7.删除变量(或对象)是不允许的:使用 "use strict",不允许删除变量(或对象)
"use strict";
var x = 3.14;
delete x; // 这将引发错误,在严格模式下不能删除非限定标识符。
8.删除函数是不允许的:
"use strict";
function x(p1, p2) {};
delete x; // 这将引发错误,在严格模式下不能删除非限定标识符。
9.重复参数名是不允许的:
"use strict";
function x(p1, p1) {}; // 这将引发错误,此上下文中不允许使用重复的参数名称
10.八进制数值文本是不允许的:
"use strict";
var x = 010; // 这将引发错误,严格模式下不允许使用八进制文字。
11.转义字符是不允许的:
"use strict";
var x = \010; // 这将引发错误,无效或意外的令牌
12.写入只读属性是不允许的:
"use strict";
var obj = {};
Object.defineProperty(obj, "x", {value:0, writable:false});
obj.x = 3.14; // 这将引发错误
13.写入只能获取的属性是不允许的:
"use strict";
var obj = {get x() {return 0} };
obj.x = 3.14; // 这将引发错误
14.删除不可删除的属性是不允许的:
"use strict";
delete Object.prototype; // 这将引发错误
15.字符串 "eval" 不可用作变量:
"use strict";
var eval = 3.14; // 这将引发错误
16.字符串 "arguments" 不可用作变量:
"use strict";
var arguments = 3.14; // 这将引发错误
17.with 语句是不允许的:
"use strict";
with (Math){x = cos(2)}; // 这将引发错误
18处于安全考虑,不允许 eval() 在其被调用的作用域中创建变量:
"use strict";
eval ("var x = 2");
alert (x); // 这将引发错误
在类似 f() 的函数调用中,this 的值是全局对象。在严格模式中,现在它成为了 undefined。全局变量在严格模式下产生undefined错误。
19.对未来的保障
严格模式中不允许使用为未来预留的关键词。它们是:
implements
interface
let
package
private
protected
public
static
yield
例子:
"use strict";
var public = 1500; // 这将引发错误,意外的严格模式保留字
警告
"use strict" 指令只能在脚本或函数的开头被识别。