js中的作用域,this指向,原型链

作用域

定义:在作用域中找到一个变量,优先在当前的作用域中查找,如果自己的作用域没有的话,会到上级[就看当前作用域在哪里定义的,跟在哪执行的没有关系]查找,如果上级还没有,会一直找到全局,全局也没有会直接报错[xxx is not defined]

全局作用域

浏览器一打开就形成一个全局作用域[会自动生成一个全局对象window],在全局作用域下声明的变量属于全局变量

let a = 1
console.log(a) // 1
function fn(){
    console.log(a) // 1
}
fn()

上面代码,在全局声明一个bianl变量a,这个变量属于全局变量,可以在当前全局作用域下的任何地方调用它

私有作用域

函数执行的时候会形成一个私有作用域,私有作用域中声明的变量属于私有变量,同时形参也属于私有变量

function fn(){
    let a = 1 
    console.log(a) // 1
}
fn()
console.log(a) //  a is not defined

上面代码中,我们在函数fn中声明一个变量,这个变量属于fn私有作用域的私有变量,只能在函数fn中只用,在外面使用会报错

this指向

this是什么?

this是执行主体

我了解的this指向,一共有7种情况

  1. 全局作用域下的this都是window
  2. 自执行函数里的this都是window
  3. 函数当做参数的时候,一般情况下都是window
  4. 函数执行,看函数前面是否有‘.’,如果有,那么点前面是谁就是谁,如果没有,this就是window
  5. 元素事件函数中的this,一般情况下都是元素本身
  6. 构造函数当中的this都是实例本身
  7. 通过call、apply、bind,可以改变this

原型链

想要学习原型链先记住三句话

  1. 所有的类天生自带一个属性prototype[原型],它是一个对象,【既然是一个对象,浏览器会默认开辟一个堆内存】
  2. 在prototype【堆内存】当中,天生自带一个属性constructor【构造函数】,他指向当前类本身
  3. 所有的对象天生自带一个属性__proto__【原型链】,他指向当前所属类的原型

原型链的查找机制

原型链__proto__在实例上找一个属性,优先到自己的私有属性上找,如果没有的话通过__proto__找到自己所属类的原型上去查找,如果自己所属类的原型上还没有,再通过__proto__向上一级查找,知道找到Object基类的原型上,,如果还没有直接返回undefined,这种查找机制,我们叫原型链

猜你喜欢

转载自www.cnblogs.com/mengxiangji/p/10575170.html