1.对象的this(指向.前面)
基本的
var a = 0
var obj = {
a:1,
fn() {
console.log(this.a,this,a);
}
}
obj.fn()//1,obj ,0
2.直接调用的this(指向window,容易混淆:闭包)
有几种情况:
2.1 函数作为参数传给函数
var a = 1
function fn() {
console.log(a);
}
function fn1(data) {
var a = 2
data()
}
fn1(fn)//打印1 属于直接调用,可以看见data()前面什么都没有
2.2 对象里的方法作为参数传给其它函数
var a = 0
var obj = {
a:1,
fn() {
console.log(this,this.a);
}
}
function fn1(data) {
var a = 2
data()
}
obj.fn()//obj,1
fn1(obj.fn)//window,0
2.3 对象里的方法赋给其它变量
var a = 0
var obj = {
a: 1,
fn() {
console.log(this, this.a);
}
}
var fn = obj.fn
fn()//window,0 直接调用 可以看见调用的时候前面什么都没有
2.4 闭包
var a = 0
function fn() {
var a = 1
return function () {
console.log(this,a,this.a);
}
}
fn()()//window,1 ,0 this还是指向window但是找变量会从定义函数的内部去找
var a =1
function fn() {
var a = 2
return {
fn() { console.log(a,this.a);}
}
}
function fn1(data){
data()
}
fn1(fn().fn)//2,1 注意输出this.a和a的区别,一个是从调用者身上找,一个从定义时的最近作用域找
千万注意:注意是打印this.x 还是直接打印x 如果是直接打印x 那么会从离定义函数的地方最近的作用域去找,如果是打印this.x就看是直接调用还是“.”前面的调用