this的用法和原理

184 阅读2分钟

this用法

函数的不同使用场合,this有不同的值。总的来说,this就是函数运行时所在的环境对象。

情况一:一般函数调用 (this 指全局对象 window)
  function clickFun(){
  console.log(this);//window
}
clickFun() 

情况二:作为对象方法的调用(这时this就指这个对象)
   var a = 2
  function foo(){
  console.log(this.a)
  }
  var obj = {
    a:1,
    f:foo,
  }
  obj.foo()// 1, this指向obj
  foo()//2,this指向全局window
情况三: 作为构造函数调用(this就指这个new新对象)
 function pro(){
 this.a = 1
   console.log(this)
 }
 var pro1 = new Pro()
 pro1.a //1 
情况四 :call(),apply(), 方法改变函数的调用对象,它的第一个参数就表示改变后的调用这个函数的对象。因此,这时this指的就是这第一个参数。
  1. call方法使用的语法规则 - 函数名称.call(obj,arg1,arg2...argN); - 参数说明:obj:函数内this要指向的对象,arg1,arg2...argN:参数列表,参数与参数之间使用一个逗号隔开
var x = 0;
function test() {
 console.log(this.x);
}

var obj = {};
obj.x = 1;
obj.m = test;
obj.m.apply(obj); //1

2. apply()方法 函数名称.apply(obj,[arg1,arg2...,argN]) 参数说明: - obj :this要指向的对象 - [arg1,arg2...argN] : 参数列表,要求格式为数组

  var lisi = {name:'lisi'}; 
var zs = {name:'zhangsan'}; 
function f(age,sex){
    console.log(this.name+age+sex); 
}
//将f函数中的this指向固定到对象zs上;
 f.apply(zs,[23,'nan']);
情况五: 箭头函数,this在声明时指向window,在调用时指向声明时所在的上下文this
  var a = 2
  var obj = {
    a:1,
    f: ()=>{console.log(this.a) }
    f1: function(){
      (()=>{console.log(this.a)})() }
    
  }
  obj.f()// 2, this指向window
  obj.f1()// 1, this指向外层的上下文

个人理解:this指向的是调用他的对象 ,就是前面的对象;全局函数函数默认挂载在window调用,所以this指向widow。

this原理

问题一: this是什么?
 1this是 JavaScript 语言的一个关键字
 2,是函数运行时,在函数体内部自动生成的一个对象,只能在函数体内部使用
问题二: this值是什么?
 函数的不同使用场合,this有不同的值。总的来说,this就是函数运行时所在的环境对象(谁调用指向
 谁)。
问题三: 为什么同一个函数在不同的环境变量执行结果可能不一样(内存的数据结构)
var obj = {
      a:1,
      f: function foo(){
         console.log(this.a)
      },
 }
 
var newObj={
         a:2
} 

 newObj.f = obj.f
 obj.a  // 1 
 newObj.a //2
 解析: obj 对象有两个属性的值类型是不同的,在内存中的表现形式也是不同的,
  obj.a 是个数值类型存储就是值1,
  obj.f 指向的是funciton,这个值存储在funtion所在的 ** 内存地址 **  foo(){}
  newObj.f = obj.f,相当于与把obj.f 的内存地址  赋值给newObj对象,运行环境在newObj对象
  
  newObj = {
     a:2,
     f:funtion foo(){
        console.log(this.a)
     }
  }
  newObj.a  调用的时候this指向的就是对象newObj。

引用

阮一峰 西陵老湿