严格模式、普通模式、箭头函数中this指向问题

var name="window";
   var obj = {
       name:"objname",
       sayHello:function(){
       console.log(obj.name)//objname
     // console.log(this);//obj
    }
   }
   obj.sayHello();

 

 

 "use strict"//严格模式下
      function foo(){
       console.log(this);
      }
      foo();//undefined
      */
   //在普通模式下,普通函数,谁调用这个函数,this就指向谁

 

 

function foo(){
          console.log(this);//window
    }
    foo();//全局函数可以看作是window的方法

 

 

var name="window";
   var age1=20;
   let age2=10;
   console.log(window.age1);//20
   console.log(window.age2);//undefined,let定义的不属于全局定义
   var obj = {
     name:"objname",
     sayHello:function(){
      console.log(this)
    }
   }
   obj.sayHello();//obj对象
   console.log(obj.name);//objname

 

var name="window";
   var obj = {
     name:"objname",
     sayHello:function(){
      return function(){
       console.log(this)
      }
     
    }
   }
   obj.sayHello()();//window
   上面相当于这个
   var f=obj.sayHello();
   obj.sayHello();//空
   console.log(obj.sayHello());//输出函数体

 

 

var name="window";
        var obj = {
          name:"objname",
          sayHello:function(){
          setTimeout(function(){//setTimeout全局方法是window方法
            console.log(this)
           })
          
         }
        }
        obj.sayHello();//window

 

 

 

箭头函数的this指向问题
   箭头函数this指向定义这个箭头函数时所在环境中的this
   在哪个地方定义就指向那个地方的this
   
       var foo=()=>{
        console.log(this);
       }
       foo();//window
       
    var name="window";
         var obj = {
           name:"objname",
           sayHello:()=>{
             console.log(this)
          }
         }
         obj.sayHello();//window
     
   上面代码运行机制相当于
   
       var obj={};
       obj.name="onjname";
       obj.sayHello=()=>{
        console.log(this);
       }
       obj.sayHello();//window
       
   
      var name="window";
          var obj = {
            name:"objname",
            sayHello:function(){
          return ()=>{
             console.log(this)
          }
            
           }
          }
          obj.sayHello()();//obj

 

 

var name="window";
        var obj = {
          name:"objname",
          sayHello:()=>{
          console.log(this);
         return ()=>{
         console.log(this)
           }
          
         }
        }
        obj.sayHello()();//window

 

 

 

var name = "window";
   var obj = {
    name: "objname",
    sayHello: function() {
     setTimeout( () => {
      console.log(this)
     })
    }
   }
   obj.sayHello(); //obj

 

 

 

 //call apply bind改变this指向
     var obj1={
      name:"obj1",
      sayHello:function(a){
       console.log(this.name);
       console.log(a)
      }
     }
     var obj2={
      name:"obj2"
     }
     obj1.sayHello.call(obj2,10);//obj2 10改变了this指向,指向call
     obj1.sayHello.apply(obj2,[20])//obj2 20改变了this指向,指向apply
     obj1.sayHello.bind(obj2)(30);//obj2 30改变了this指向,指向bind

 

//取数组中的最大值最小值,及其索引
     var arr=[11,57,0,-2];
     var min=Math.min.apply(null,arr);//不改变原数组
     console.log(min);//-2
     console.log(arr.indexOf(min));//3

转载于:https://www.cnblogs.com/xiangW/p/10665677.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值