this是什么
1.this实际是在函数被调用时才发生的绑定,也就是说this具体指向什么,取决于你是怎么调用的函数。
this的四种基本用法
1.在一般函数方法中使用 this 指代全局对象
2.作为对象方法调用,this 指代上级对象
3.作为构造函数调用,this 指代new 出的对象
4.apply 调用 ,apply方法作用是改变函数的调用对象,此方法的第一个参数为改变后调用这个函数的对象,this指代第一个参数
第一种是默认绑定的方式,因为函数直接调用。没有应用其他的绑定规则,这里进行了默认绑定,将全局对象绑定this上,所以this.x 就解析成了全局变量中的x.
function hello(){
this.x = 3;
console.log(this.x)
}
hello();
//此时控制台打印3
第二种是隐式绑定
function foo() {
console.log( this.a );
}
var a = 3;
var obj = {
a: 4,
foo: foo
};
obj.foo();
这里的obj.foo()打印的是4
因为这里foo函数被当做引用属性,被添加到obj对象上。这里的调用过程是这样的:
获取obj.foo属性 -> 根据引用关系找到foo函数,执行调用
所以这里对foo的调用存在上下文对象obj,this进行了隐式绑定,即this绑定到了obj上,所以this.a被解析成了obj.a,即4。
第三种作为构造函数调用,this 指代new 出的对象
function hello(){
this.x = 1;
}
var s = new hello();
console.log(s.x)
//运行结果为1
var x = 2;
function hello(){
this.x = 1;
}
var o = new hello();
console.log(x)
第四种apply 调用 ,apply方法作用是改变函数的调用对象,此方法的第一个参数为改变后调用这个函数的对象,this指代第一个参数
var x = 0;
function hello(){
console.log(this.x)
}
var h = {};
h.x = 1;
h.m = hello;
h.m.apply(); //输出为0
h.m.apply(h) //输出1