严格模式:
ECMA5后的新指令:"use strict"
它不算一条语句,而是一段文字表达式,更早版本的JavaScript会忽略它。
严格模式无法使用未声明的变量。
严格模式的特点:
- 在函数内部声明严格模式,拥有局部作用域。只有函数内部的代码按照严格模式执行。
- 不允许使用未声明的对象
- 不允许删除对象
- 不允许删除函数
- 不允许重复函数参数名
- 不允许八进制数值文本和转义字符
- 不允许写入只读属性、只能获取的恶属性
- 不允许删除不可删除的属性如prototype
- 不允许使用为未来预留的关键词
- 在严格模式下,函数中的this是undefined
this关键词:取决于它使用的位置,指代它所属的对象
- 方法中,指代所有者对象(在JavaScript中函数一般通过函数名来调用,而方法则是通过对象来调用的函数)
- 单独情况下,指代全局对象(object Window)
- 函数中,指代全局对象
- 函数中,严格模式下,this是undefined
- 事件中,this指代接收事件的HTML元素
- call()和apply()这样的方法可以将this引用到任何对象
<script> //创建对象 var person = { name : "lisi", age : 18, fullName : function (){ return this.name + " " + this.age; } }; //显示对象中的数据 //方法中的this指代方法所有者对象,person.fullName()中的this指代person对象 document.getElementById("demo").innerHTML = person.fullName();
<script> //严格模式下,函数中的this是undefined "use strict"; document.getElementById("demo").innerHTML = myFunction(); function myFunction() { return this; } </script>
<!-- 在HTML事件中,this指代接收此事件的HTML元素 --> <button onclick="this.style.display='none'">点我消失</button>
<script> // call会使this对象指向传进来来的参数对象,因此调用的是person2的变量。 var person1 = { fullName : function(){ return this.name + " " + this.age; } } var person2 = { name : "lisi", age : 2 } alert(person1.fullName.call(person2)); </script>
严格模式的优点:
- 使我们更容易编写安全的JavaScript
- 把之前可接受的坏语法转变为真实的错误
- 在普通JavaScript中,错打变量名会创建新的全局变量,在严格模式中会抛出错误,无法创建。
- 在普通JavaScript中,如果向不可写属性赋值,开发者不会得到任何错误反馈。
- 在严格模式中,向不可写的、只读的、不存在的属性赋值,或者向不存在的变量或者对象赋值,将抛出错误、