js代码在执行时有三类可引用的变量:词法作用域、this、局部变量。局部变量不讨论, 因为是执行时函数自己创建的、只存在于函数执行期间。词法作用域就是函数定义时包含函数定义的父作用域、父作用域的父作用域、父作用域的父作用域的父作用域的等, 这个是闭包的实质。this:函数是被谁调用的,函数在执行时函数里面的this就指向谁,也就是说, 函数内部的this关键字代表的值是运行时被赋予的。如果函数是直接执行, 那this指向的就是函数执行时所在的的作用域,也就是说,函数在全局作用域直接执行,执行时函数里this指向window, 函数在函数里面执行, this指向执行这个函数的函数,如果函数是某个对象的属性、通过对象.函数名(),这种方式执行,this指向的是对象。有一点例外, 通过new操作符调用函数时, new执行期间函数里this指向的是被new出来的对象。this查找变量有个特点, 首先会在this指向的对象上查找属性,有就返回;没有的话看this指向的对象有没有_proto_属性,如果有就会到_proto_属性指向的对象里面去找,并且这个过程是递归的,知道最后一个没有_proto_属性的对象位置。任何函数都有prototype属性, 通过对一个函数执行new操作符能得到这个对象,并且得到的对象会自动获得一个constructor属性指向这个函数,会自动获得一个_proto_属性指向函数的prototype对象,这就是js中实现对象继承的方式。通过_proto_属性进行串联就形成了原型链。