作用域

作用域是可访问变量,对象,函数的集合。

(即某些特定部分中变量,函数和对象的可访问性。)

 

作用域最大的用处就是隔离变量,不同作用域下同名变量不会有冲突,不会被外泄和暴露,不会污染到外面,不会对其他的库或者 JS 脚本造成影响

 

变量生命周期:局部变量在函数执行完毕后销毁。

全局变量在页面关闭后销毁。

 

 

局部作用域:在函数内声明

var name="global";

if(true){

    var name="local";

    console.log(name)

}

console.log(name);

都输出是“local"

块语句(如 if 和 switch 条件语句或 for 和 while 循环语句),不像函数,它们不会创建一个新的作用域。在块语句中定义的变量将保留在它们已经存在的作用域中。

 

Js没有块级作用域,ES6新增命令let和const才有了

 

当使用var声明一个变量时,创建的这个属性是不可配置的,也就是说无法通过delete运算符删除

var name=1    ->不可删除

sex=”girl“         ->可删除

this.age=22    ->可删除

 

特点:先扫描整个函数体的语句,把所有申明的变量“提升”到函数顶部,自动提升了变量的声明,但不会提升变量的赋值(不报错,但是打印还是undefined)

所以:在函数内部定义变量时,严格遵守“在函数内部首先申明所有变量”这一规则。最常见的做法是用一个var申明函数内部用到的所有变量。

 

全局作用域

 

全局变量,在函数外定义|在函数内没有声明(没有使用 var 关键字)

不在任何函数内定义的变量就具有全局作用域。

所有window对象的属性拥有全局作用域。

例如:全局变量course = window.course

            alert()函数其实也是window的一个变量

 

全局变量可能会造成命名冲突,减少冲突的一个方法是把自己的所有变量和函数全部绑定到一个全局变量中。

 

作用域链

静态作用域 自由变量 要到创建这个函数的那个域作用域中取值

函数执行先找当前执行环境中的对象,找不到再向外层寻找,一层一层的关系,即作用域链

 

作用域是分层的,内层作用域可以访问外层作用域的变量,反之则不行

 

this指向

this的指向在函数创建的时候是决定不了的,在调用的时候才能决定,谁调用的就指向谁

        1:如果一个函数中有this,但是它没有被上一级的对象所调用,那么this指向的就是window(非严格版才是,严格版是undefined)。

  2:如果一个函数中有this,这个函数有被上一级的对象所调用,那么this指向的就是上一级的对象。

  3:如果一个函数中有this,这个函数中包含多个对象,尽管这个函数是被最外层的对象所调用,this指向的也只是它上一级的对象。

        4:   赋值的时候没有执行,即没有被使用,也指向window

        5:   return 如果返回值是一个对象,那么this指向的就是那个return的对象,如果return值不是一个对象那么this还是指向函数的实例

 

构造函数 :new关键字可以改变this的指向,将这个this指向对象(new关键字会创建一个空的对象,然后会自动调用一个函数apply方法,将this指向这个空对象,这样的话函数内部的this就会被这个空的对象替代)

 

with语句

person={

name:"yhb",age:22,height:175,

wife:{name:"lwy",age:21}

};

with(person.wife){

console.log(name);

}

将person.wife添加到当前作用域链的头部,所以输出的就是:“lwy".

with语句结束后,作用域链恢复正常。js

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值