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

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时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还有些许内容本文并未提及,如严格模式、箭头函数等。

 

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值