this —>javaScirpt 关键字
当前环境执行期上下文对象的一个属性
this在不同环境,不同作用下表现不同
全局作用域下的this ——-> 全局对象
window 和this的关系
console.log(this ==== window) // truevar a = 1
this ——> 在浏览器 node worker
获取全局变量
web : window,self ,frames
node: global
worker:self
通用:golbalThis
严格模式下this返回undefined 
class Test1{constructor () {}sat (){}static do (){}}
在构造函数内部
function Test (){this.a = 1 // new 的过程是 1. this = {}this.b = 2 // 2. {a:1,b:2}console,log(this) =======> // 3. return thisreturn {c:1, // 如果你是手动改变了return的值d:2 // 那么会改变,但是this的指向新} // 构造出来的值 {a:1,b:2}}let test =new Text()
在函数内部
let obj = {actions : function () {console.log(this) // 指向的是objfunction test(){console.log(this) // 这个指向的是window}test()}obj.actions() // 这个
在dom
事件处理函数内部的this总是指向dom元素本身
let oBtn = document.getElementById('j_btn')oBtn.onclick = function (){console.log(this)}oBtn.addEventListen('Click',function (){console,log(this)})
function Foo() {getName = function () {console.log(1);}return this}Foo.getName = function () {console.log(2);}Foo.prototype.getName = function () {console.log(3);}var getName = function () {console.log(4);}function getName() {console.log(5);}Foo.getName()getName()Foo().getName()new Foo.getName()new Foo().getName()new new Foo().getName()
//预编译过程1. go:{getName : undefined // var 声明变量}2. go:{ // function 声明变量getName : function getName() {console.log(5);}Foo: function Foo() {getName = function () {console.log(1);}return this}}3. go:{ // var 赋值getName : function () {console.log(4);}Foo: function Foo() {getName = function () {console.log(1);}return this}}// js 执行过程4. 执行 Foo.getName() // function用.来调用可以看作是一个对象调用自身的方法 // 25. 执行 getName() // 46. 执行 Foo().getName() ==>Foo() 完了之后go :{getName = function () {console.log(1);}}getName() // 17.执行 new Foo.getName() ==> 应为 .的优先级高于 new先执行 Foo.getName() 在new 没有意义 // 28.执行 new Foo().getName() ==> 先执行 Foo() , 然后new Foo(),最后 .getName()所以执行 Foo.prototype.getName = function () {console.log(3);}9.执行new new Foo().getName() ==> 1. new Foo().getName()2. new new Foo().getName() 没有意义
