this —>javaScirpt 关键字
当前环境执行期上下文对象的一个属性
this在不同环境,不同作用下表现不同
全局作用域下的this ——-> 全局对象
window 和this的关系
console.log(this ==== window) // true
var 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 this
return {
c:1, // 如果你是手动改变了return的值
d:2 // 那么会改变,但是this的指向新
} // 构造出来的值 {a:1,b:2}
}
let test =new Text()
在函数内部
let obj = {
actions : function () {
console.log(this) // 指向的是obj
function 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用.来调用可以看作是一个对象调用自身的方法 // 2
5. 执行 getName() // 4
6. 执行 Foo().getName() ==>
Foo() 完了之后
go :{
getName = function () {
console.log(1);
}
}
getName() // 1
7.执行 new Foo.getName() ==> 应为 .的优先级高于 new
先执行 Foo.getName() 在new 没有意义 // 2
8.执行 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() 没有意义