我不知道的javascript关键字——this

this的指针作用域总结

  1. 在全局执行环境中使用this,表示Global对象,在浏览器中就是window对象。
	console.log(this); //Window
	console.log(typeof this); //object
	console.log(this === window); //true

 

  1. 当在函数执行环境中使用this时,情况就有些复杂了。
    如果函数没有明显的作为非window对象的属性,而只是定义了函数,不管这个函数是不是定义在另一个函数中,这个函数中的this仍然表示window对象。
    如果函数显示地作为一个非window对象的属性,那么函数中的this就代表这个对象.
  function a() {
        function b(){
            console.log(this);  // Window
            console.log(typeof this); // object
            console.log(this === window); // true
        }
        b();
    }
    a();
    var obj = {
        name:'nianyuyu',
        show:function(){
            console.log(this);  //{name: "nianyuyu", show: ƒ}
            console.log(typeof this); //object
            console.log(this === window); //false
        }
    }
    obj.show();

 

  1. 当通过new运算符来调用函数时,函数被当做一个构造函数,this指向构造函数创建出来的对象。
	var name = "windows";
	function a() {
    	console.log(this.name);
	}
	a(); // windows
	var obj = new a();  // undefined

 

修改this的作用域关键字:call

Function.prototype.call()

可知它是Function原型的一个方法,它本身会调用另外一个函数,并接收指定的this值和参数列表。也可以理解为,call()方法中接收的对象调用当前对象所拥有的函数,而返回值则是该调用方法的返回值。

fun.call(thisObj, arg1, arg2, …)

以上,会将fun的上下文对象this修改为thisObj,并将可选参数arg1,arg2等当作参数传递给fun函数。

 var student = {
     name:'',
     getStr:function(desc1,desc2){
         console.log(desc1 + desc2 + this.name);
      }
   }
  var xiaoming = {
     name:'xiao ming'
  }
 student.getStr.call(xiaoming,"hello ","my name is ");

 

修改this的作用域关键字:apply

Function.prototype.apply()

应该说apply方法跟call方法的作用类似,只是apply接收的参数是指定的this值和一个包含多个参数的数组作为参数列表,而call是接受若干个参数的列表。

fun.apply(thisObj, [argsArray])

注意,argsArray是一个数组或者类数组对象。

var student = {
     name:'',
     getStr: function(desc1,desc2){
         console.log(desc1 + desc2 + this.name);
         console.log(this) // {name: "xiao ming"}
     }
}
var xiaoming = {
    name:'xiao ming'
}
student.getStr.apply(xiaoming,["hello ","my name is "]);

 

修改this的作用域关键字:bind

Function.prototype.bind()

bind方法会创建一个新的函数,并将原函数this的值绑定为当前指定的对象,返回由指定this值和初始化参数的原函数的拷贝。

fun.bind(thisObj[, arg1[, arg2[, …]]])

即:将fun函数的this值指定为thisObj,并将参数列表arg1,arg2等传递给该函数所创建的一个新的函数。

  var student = {
       name:'',
       getStr: function(desc1,desc2){
           console.log(this) // {name: "xiao ming"}
           console.log(desc1 + this.name);
        }
   }
   var xiaoming = {
       name:'xiao ming'
   }
  var a = student.getStr.bind(xiaoming);
  a("hello","my name is ");   // 传递参数,调用函数

 

修改this的作用域关键字:eval

apply,bind,call的比较

  • 相似点
  1. 都是用来改变函数的this对象的指向的。
  2. 第一个参数都是this要指向的对象。
  3. 都可以利用后续参数传参。
     
  • 不同点
  1. call和apply都是对函数的直接调用,而bind方法返回的仍然是一个函数,因此后面还需要()来进行调用才可以。
  2. call后面的参数与方法中的参数是一一对应的。而apply的第二个参数是一个数组,数组中的元素是和方法中的参数一一对应的。bind的参数可以等调用函数的时候传递。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

qq_21439711

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

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

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

打赏作者

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

抵扣说明:

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

余额充值