1.隐含参数this的概述,了解什么是参数this
通常说this是一个隐含参数,而这个隐含参数是函数被调用时向函数内部传递进的参数,this指向的是一个对象,这个对象被称之为函数上下文对象,调用方式不同,this会指向对象也不同。
那么我们需要知道:
- window即浏览器窗口,全局对象就是window对象。
- 函数被调用时即会向函数内部传递一个隐含参数,无论函数有无形参、实参。this是浏览器传回的,并只与函数调用有关。
- 我们不需要看函数如何创建,只需要看函数被调用的方式
2.对this指向的示例及讲解
首先,先看函数进行直接调用的结果
function Ss(){
console.log(this);
}
Ss();
//结果为window,即全局
直接对函数调用,this是全局对象,那么如果两层的函数嵌套呢?
function Ss(){
Nn();
function Nn(){
console.log(this);
}
}
Ss();
//this参数仍然是window
其实接下来,无论套多少层函数,this参数都是指向全局对象,也就是window。
由此可知,函数的形式调用时,this永远都是指向window。
不过还有一个叫对象的家伙:
我们要看看对象用this时this的指向,因为this是函数里的隐含参数,没法在对象里写,那就需要在对象内调用一个函数。
function Ss(){
console.log(this);
}
//创建一个对象
var obj1 = {
name: "对象1",
sayName: Ss
};
obj1.sayName();
//结果this指向Object
结果是Object,因为在全局调用了obj1这个对象里指定的函数。
就好比:在学校里校领导(全局)要让函数Ss去个地方站岗逮违纪,但是这个Ss在obj1这家伙的部门里,于是就通过obj1这个家伙来派遣(直接调用对象),而函数Ss只知道是obj1让自己去干活(对象调用函数),于是自己思维“this”想到的调用自己的人就是obj1这个对象了(指向调用此函数的对象)。
直接调用函数,就相当于领导亲自去找他,他心里想的"this"也就是领导(window)而非对象(Object)了。
那么,按这个例子,我们看看以下代码:
var cz = "全局";
function Ss(){
console.log(this.cz);
}
var obj1 = {
cz: "对象1",
sayName: Ss
};
obj1.sayName(cz);
//结果在控制台显示“对象1”
我们有一个全局变量,就把他当成领导(window)的长相,而对象里的对象1,当作是obj1的长相。
当是领导让obj1来派遣Ss时,Ss一眼就能看出obj1的长相(对象1),并在心里(this)记住obj1的样子(对象1),而Ss在这里压根没见过领导,也就不知道领导长什么样,因此this指向obj1的对象1。
注意函数代码中的(this.cz)
而另一种可能:
var cz = "全局";
function Ss(){
console.log(cz);
}
var obj1 = {
cz: "对象1",
sayName: Ss
};
obj1.sayName(cz);
//this参数是 “全局”
没错,这里的函数内没有了this。
根据结果,可以看出在变量名称相同的情况下,全局变量优先于局部变量,领导比obj1优先。
当然,可能this的作用并不够明显,那么我们接下来设定两个obj同级的小官:
var cz = "全局";
function Ss(){
console.log(this.cz);
}
var obj1 = {
cz: "对象1",
sayName: Ss
};
var obj2 = {
cz: "对象2",
sayName: Ss
};
obj1.sayName(cz);
可能看不出什么区别,但是this(在函数内的代码)一旦去掉,结果就一定是输出“全局”,如果单独写obj1,那只能是“obj1”的”对象1”,单独写obj2,则下方调用对象的语句也需要改为obj2.sayName(cz); 这样看来Ss就未免太笨了,可能不适合这个活。而有了this,相当于有了思考能力,无论是哪个对象叫他,他都能看到叫他的那个它是什么样(对象1/对象2),以此辨认出(this指向)。
3.总结
-
解析器在调用函数每次都会向函数内部传递进一个隐含的参数,这个隐含的参数就是this,this指向的是一个对象,这个对象我们称为函数执行的上下文对象,根据函数的调用方式的不同,this会指向不同的对象(谁调用,this指向谁)。
- 以函数的形式调用时,this永远都是window(全局对象)。
- 以方法的形式调用时,this就是调用方法的那个对象(即通过对象调用函数,this指向调用函数的对象)。
注:关于this还有些许内容本文并未提及,如严格模式、箭头函数等。