22 严格模式&this关键词&let&const

严格模式:

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对象指向传进来来的参数对象,因此person1的fullName方法调用的是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中,如果向不可写属性赋值,开发者不会得到任何错误反馈。
  • 在严格模式中,向不可写的、只读的、不存在的属性赋值,或者向不存在的变量或者对象赋值,将抛出错误、

 

let关键字:

  • let对象在未声明之前不可以使用,否则会报错:ReferenceError  variable is undefined
  • var声明的变量属于全局对象window,let声明的变量不属于window
  • 在块外声明,let和var都拥有全局作用域,区别是let声明的对象不属于window。
  • 在相同的块或作用域中,var和let声明的对象不允许相互覆盖,即不能重新声明同名对象,否则会报错:already declared.
  • 在不同的块中,可以使用let重新声明对象

循环作用域:

<script>
    var i = 7;
    for( i = 0;i < 10; i++){}    
    //此处i = 10
    document.getElementById("demo").innerHTML = i;
</script>
<script>
    let i = 7;
    for( i = 0;i < 10; i++){}    
    //此处i = 10
    document.getElementById("demo").innerHTML = i;
</script>
<script>
    let i = 7;
    for( let i = 0;i < 10; i++){}    
    //此处i = 7,如果在循环内用let声明了i,那么i只有在循环内才是可见的
    document.getElementById("demo").innerHTML = i;
</script>

 

const关键字:

与let相似,区别在于const变量需要在声明时就赋值,而且不能重复赋值,否则报错:syntaxError。

可以对const声明的对象属性与数组元素进行更改,但是无法对其重新赋值。

在相同的块或者作用域中,const定义的变量不允许与var和let定义的变量重复声明,否则报错。

 

posted @ 2019-11-13 18:59  IslandZzzz  阅读(237)  评论(0编辑  收藏  举报