本站消息

站长简介/公众号


站长简介:高级软件工程师,曾在阿里云,每日优鲜从事全栈开发工作,利用周末时间开发出本站,欢迎关注我的微信公众号:程序员总部,程序员的家,探索程序员的人生之路!分享IT最新技术,关注行业最新动向,让你永不落伍。了解同行们的工资,生活工作中的酸甜苦辣,谋求程序员的最终出路!

 价值13000svip视频教程,前端大神匠心打造,零基础前端开发工程师视频教程全套,基础+进阶+项目实战,包含课件和源码

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2021-05(16)

2021-06(107)

2021-07(10)

2021-08(82)

2021-09(53)

this的指向问题

发布于2021-10-05 19:30     阅读(1061)     评论(0)     点赞(9)     收藏(4)


1. 普通函数this

没有特殊情况,就是指向全局对象-window

	let arr='aa'
	function fn(){
    alert(this.username);//undefined
	}
	fn();

因为我声明的方式是let,不会是window对象,
那么当使用var声明

	var arr='aa'
	function fn(){
	    alert(this.username);	//aa
	}
	fu();
	//---------------
	window.arr='aa'
	function fn(){
	    alert(this.username);	//aa
	}
	fn();
	//可以理解为
	//window.fn();

2. 对象函数this

这个简单理解,就是那个函数调用,this就指向哪里

	window.a = 2222
	let obj={
	    b:111,
	    fn:function(){
	        alert(this.b);//111
	        alert(this.a);//undefined
	    }
	}
	obj.fn();

很明显,第一次就是输出obj.a,就是111。而第二次,obj没有b这个属性,所以输出undefined,因为this指向obj。
但是,还有一种情况是

	let obj1 = {
	    a:222
	};
	let obj2 = {
	    a:111,
	    fn:function(){
	        alert(this.a);
	    }
	}
	obj1.fn = obj2.fn;
	obj1.fn();	//222

这个就是, 虽然obj1.fn是从obj2.fn赋值而来,但是调用函数的是obj1,所以this指向obj1。

3. 构造函数this

		let Test = function(){
	    this.name = '111';
	}
	let sub = new Test ();
	sub .name='cc';
	console.log(sub .name);		//cc
	let sub1 = new Test ();
	console.log(sub1.name)		//111

构造函数当中的this,指向通过这个构造函数创建出来的实例本身
在构造函数里面返回一个对象,会直接返回这个对象,而不是执行构造函数后创建的对象

4. 强制改变this指向 call apply bind

语法:

  • call方法 语法 call(this的指向,function的参数)
  • apply方法 语法 apply(this的指向,[function的参数])
  • bind本身不回去执行要被改变this指向的这个方法,而是返回一个已经被改变了this指向的新方法
	let obj = {
            name: "haha",
            birthDay: 2000,
            year: 2021,
        }
        obj.age();
        
     //	call
	obj.age.call({
           name: "呵呵",
           birthDay: 2001,
           year: 2051
        },"--测试参数--","==测试=="

	//	apply
	obj.age.apply({
           name: "嘻嘻",
           birthDay: 1900,
           year: 2051
        },["--测试参数01--","==测试参数02=="]

	// bind 
	   let ageFunc = obj.age.bind({
            name: "bind",
            birthDay: 19,
            year: 20
        });
        console.log(ageFunc);
        ageFunc()

原文链接:https://blog.csdn.net/weixin_57774738/article/details/120587520




所属网站分类: 技术文章 > 博客

作者:前端黄柠檬

链接:http://www.qianduanheidong.com/blog/article/197928/8799edc0033e9e8185bf/

来源:前端黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

9 0
收藏该文
已收藏

评论内容:(最多支持255个字符)