zoukankan      html  css  js  c++  java
  • 关于this 的一个问题

    var name = "the window";
    
    var object = {
    
    name:"my object";
    getName:function(){
        return this.name;
    }
    };
    
    object.getName(); //"my object"
    (object.getName)(); //"my object"
    (object.getName=object.getName)(); //"the window"

    为什么呢?

      • (object.getName)() 与 object.getName() 的等价的,因为 xxx.xxx(成员访问) 的优先级高于xxx(xxx)(函数调用),所以加不加圆括号不影响结果(关于运算符优先级可参考 运算符优先级);

      • (object.getName=object.getName) 是一个赋值表达式,赋值表达式求值结果是右值,所以该表达式的值是getName函数。你可以这么理解:(object.getName=object.getName)() 等价于 var b; (b=object.getName)() 等价于 var b; b=object.getName; b()

      • 严格模式下,(object.getName=object.getName)() 会报错,因为严格模式下,禁止 this 关键字指向全局对象。

    函数里的 this 取决于你调用它时的上下文。

    1. 当函数作为对象的方法调用时,this 指向这个对象。

    2. 当你直接执行它时,this 指向 window。

    3. 你还可以用callapplaybind方法来指定this

    下面有一段示例帮助你理解:

    var say = function () {
      console.log('My name is', this.name);
    };
    
    var jack = {
      name: 'Jack',
      say: say
    };
    
    var rose = {
      name: 'Rose',
      say: say
    };
    
    jack.say(); // My name is Jack
    rose.say(); // My name is Rose
    
    window.name = '世界之窗';
    say(); // My name is 世界之窗

    题目里的(object.getName=object.getName)();这种写法有意思的地方在于,object.getName=object.getName这个赋值操作的返回结果是下面这个函数体,

    function(){
        return this.name;
    }

    所以整个这一句的执行结果等同于

    (function(){
        return this.name;
    })();

    结合此答案最前面提到的第 2 点,可知这里的this就指向window

  • 相关阅读:
    011. Python中*args, **kwargs 和 pass 和self 解释
    010. windows10下安装kivy 1.9.1版
    013. MVC5过滤器
    制作ubuntu16.04 自动安装iso镜像 二
    Nexus安装
    使用docker-compose 大杀器来部署服务 上
    Docker-Compose入门
    nvidia-docker命令详解
    安装使用NVIDIA-Docker-- 可使用GPU的Docker容器
    frp实现内网穿透
  • 原文地址:https://www.cnblogs.com/skylor/p/4766780.html
Copyright © 2011-2022 走看看