- 任何函数运行的时候,都会创建一个context对象,context对象有一个this对象,在运行的时候决定。
- 任何函数都对应一个reference类结构体(具体叫啥有点忘了),简单就抽象成这样Reference{ base ,name}; base对应就是this,name就是函数名称;
- this 的范围:最近的{}
举个例子,自己慢慢悟吧。
javascript
function foo(){} // 对应: {base:window,name:foo};
let a={ foo }
a.foo(); // 对应 {base:a,name:foo}
简单粗暴的方法,就是去分析,f()在运行的时候,它的base是什么
,base为null,就是window/全局。
那怎么判断base呢?就是看f()前面有没有 .
javascript
var obj1 = {
a: 1
}
----------
var obj2 = {
a: 2,
foo1: function () {
console.log(this.a)
},
foo2: function () { // 分析obj2.foo2();
setTimeout(function () { // 运行这个函数的时候,没有. ,指向全局呗, 和setTimeout没关系
console.log(this)
console.log(this.a)
}, 0)
}
}
var a = 3
obj2.foo1()
obj2.foo2()
javascript
function foo () {
console.log(this.a)
return function () {
console.log(this.a)
}
}
var obj = { a: 1 }
var a = 2
foo() // 2 foo是一串代码,foo()是执行这串代码,返回的是一串代码,返回的这串代码没执行
foo.call(obj) // 1 foo这串代码,绑定this为obj,并执行。 相当于this指向obj,然后执行foo();
foo().call(obj) // 2 1 foo(),执行,并返回新函数,执行新函数,并把新函数的this指向obj