zoukankan      html  css  js  c++  java
  • JS this指向

    this理解

    this指的是当前调用的对象,是在JS运行时确定。无论何时,要想获取this指向谁,就要知道运行时谁在调用这个方法或者变量。

    常见的情况

    1.全局变量会被挂载到window上作为属性。

    function test(){
       console.log(this.a)  
    }
    var a = 5;
    test();  //这里实际是window.test(),test作为window的属性,a也是一样。

    2.作为对象属性,由对象调用

    function test(){
       console.log(this.a)  
    }
    var a = 5;
    var obj = {
         a:3;
         test:test
    }
    obj.test();

    3.把函数赋值给全局变量

    function test(){
       console.log(this.a)  
    }
    var a = 5;
    var obj = {
         a:3;
         test:test
    }
    let t = obj.test;
    t();    //5

    注意:这里是将对象的test属性赋值给t,而test属性就是test方法,所以t相当于test这个方法。

    4.对象属性内调用方法

    function test(){
       console.log(this.a)  
    }
    var a = 5;
    var obj = {
         a:3;
         test:function(){
            test();    
         }
    }
    obj.test(); //5,虽然test在obj内,但是调用test方法并未使用obj对象
    function test(){
       console.log(this.a)  
    }
    var a = 5;
    var obj = {
         a:3;
         test:function(){
            console.log(this.a)  //this是obj对象
         }
    }
    obj.test(); //3
    function test(){
       console.log(this.a)  
    }
    var a = 5;
    var obj = {
         a:3;
         test:function(){
            console.log(this.a) //3
            (function(){
                console.log(this.a) //5,this依然是window
                this.a+=1;
                 console.log(this.a) //4
            })()
         }
    }
    obj.test(); 

    5.多级调用

    function test(){
       console.log(this.a)  
    }
    var a = 5;
    var obj = {
         a:3;
         b:{
           test:function(){
              console.log(this.a)  //undefined
           }
         }
         
    }
    obj.b.test();    //看清楚这里有没有括号,有表示执行方法;无表示方法的定义

    由于最后调用test()是b所以寻找b内的a,不存在就是未定义。

    在b内定义a时

    function test(){
       console.log(this.a)  
    }
    var a = 5;
    var obj = {
         a:3;
         b:{
           a:9,
           test:function(){
              console.log(this.a)  //9
           }
         }
         
    }
    obj.b.test();    //看清楚这里有没有括号,有表示执行方法;无表示方法的定义
  • 相关阅读:
    for() 和$.each()的用法区别
    HTML5 UTF-8 中文乱码
    chrome,opera..通过file协议浏览html代码时,发送的ajax请求本地文件,会报跨域错误
    局部方法$("html").load()和全局方法$.get()、$.post()
    iOS开发--动画篇之layout动画深入
    iOS 开发--转场动画
    iOS开发--泛型
    Python十分钟学会
    iOS 开发--动画
    一个简单的ObjC和JavaScript交互工具
  • 原文地址:https://www.cnblogs.com/hzozj/p/11721725.html
Copyright © 2011-2022 走看看