0
点赞
收藏
分享

微信扫一扫

JavaScript中参数this的简单抽象化理解 this指向 window object 对象 函数

哈哈我是你爹呀 2022-03-12 阅读 40

 

目录

1.隐含参数this的概述,了解什么是参数this

2.对this指向的示例及讲解

3.总结


1.隐含参数this的概述,了解什么是参数this

通常说this是一个隐含参数,而这个隐含参数是函数被调用时向函数内部传递进的参数,this指向的是一个对象,这个对象被称之为函数上下文对象,调用方式不同,this会指向对象也不同。

那么我们需要知道:

  1. window即浏览器窗口,浏览器中的全局对象就是window对象。
  2. 函数被调用时即会向函数内部传递一个隐含参数,无论函数有无形参、实参。this是浏览器传回的,并只与函数调用有关。
  3. 我们不需要看函数是如何创建,只需要看函数的被调用方式

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是函数里的参数,那我们就需要在对象内调用一个函数。

	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,可以将这种情况理解为领导(cz全局)和obj1(cz对象1),领导先来喊Ss这苦命的工具人去干活,然后还贴心的怕Ss忘了,又让obj1提醒一遍,obj1一提醒,他立马想起来了,这个事情领导要求过,就想起了领导,吓得一身冷汗,就只顾着想(调用的结果是)领导(全局)了。也就是是领导(window)优先于obj1(Object)。


当然,可能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永远都是window
  • 以方法的形式调用时,this就是调用方法的那个对象

注:关于this还有些许内容本文并未提及,如严格模式等。

举报

相关推荐

0 条评论