JavaScript中this关键字的指向


笔记放在Github上,点击访问下载


this 作为函数内部的属性,它指向的是函数执行的环境变量,即当前的函数作用域。
在 JavaScript 中 this 主要有以下五种情况的指向:

  1. 纯粹的函数调用(匿名函数的执行环境具有全局性)

    function test(){
    	console.log(this);
    }
    test();
    
    var test = function(){
    	console.log(this);
    }
    test();
    

    此时 thisnodejs 环境中指向的是全局变量 global:
    在这里插入图片描述
    在浏览器中指向的是window对象:
    在这里插入图片描述

  2. 作为对象方法被调用

    var test = {
    	sayName:function(){
    		console.log(this);
    	}
    };
    test.sayName();
    

    此时 this 指向上一级对象即 test,打印结果为:

    { sayName: [Function: sayName] }
    
  3. 作为构造函数被调用

    function Test(){
    	this.name = 1;
    }
    var test = new Test();
    console.log(test.name);
    ------------------------
    1
    

    此时的 this 指向的是这个新对象 test

  4. apply()或call()调用

    function fun(){
    		console.log(this.name);
    	}
    	var obj = {
    		name:"obj"
    	};
    	var obj2 = {
    		name:"obj2"
    	};
    	fun.apply(obj);//obj
    	fun.call(obj2);//obj2
    

    调用 apply()call() 方法,可以将一个对象指定为第一个参数,此时这个对象就是函数执行的 this

    在 apply 模式中如果使用 null,就是函数模式,如果使用对象,就是方法模式。
    当call或apply的第一个参数为null || undefined时 this指向window ||global

    apply()call() 方法不同在于:
    call() 可以将实参在对象之后依次传递,apply() 需要将实参封装到数组中统一传递。
    call(obj,1,2,.....);
    apply(obj,[1,2,3,....]);

    例1:

    		function fun(a,b){
    			console.log("a="+a);
    			console.log("b="+b);
    			console.log(this.name);
    		}
    		var obj = {
    			name:"obj"
    		};
    		var obj2 = {
    			name:"obj2"
    		};
    		fun.apply(obj,[1,2]);
    		//输出:a=1 b=2 obj
    		fun.call(obj2,1,2);
    		//输出:a=1 b=2 obj2
    

    例2:

    	var obj = {
    		name:"obj",
    		sayName:function(){
    			console.log(this.name);
    		}
    	};
    	var obj2 = {
    		name:"obj2"
    	};
    	obj.sayName.apply(obj2);
    	//打印出 obj2
    
  5. 调用bind()方法
    test.bind(); 不传参数默认指向全局变量global,浏览器指向window。
    test.bind(obj); 不执行test函数,只是更改 this 指向,返回更改了 this 指向后的test函数。
    传递参数的两者表示:
    test.bind(obj)(5,6)
    test.bind(obj,5,6)

    	function test(a,b){
    		console.log(this,a,b);
    		}
    	var obj = {};
    	test.bind();//不执行
    	test.bind(obj)(1,2);//{} 1 2
    	test.bind(obj,1,2)();//{} 1 2
    
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

King_960725

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值