zoukankan      html  css  js  c++  java
  • this 的几种使用场景

    JavaScript 中的 this 含义要丰富得多,它可以是全局对象、当前对象或者任意对象,这完全取决于函数的调用方式。JavaScript 中函数的调用有以下几种方式:

    1. 作为对象方法调用

    JavaScript 中,函数也是对象,因此函数可以作为一个对象的属性,此时该函数被称为该对象的方法,在使用这种调用方式时,this 被自然绑定到该对象

    var test = {
        a:0,
        b:0
        get:function(){
            return this.a;
        }
    }
    

    2. 作为函数调用(全局调用)

    函数也可以直接被调用,此时 this 绑定到全局对象。在浏览器中,window 就是该全局对象。比如下面的例子:函数被调用时,this 被绑定到全局对象,接下来执行赋值语句,相当于隐式的声明了一个全局变量。

    var x = 10;
    function foo() {
      console.log(this); //Window
      console.log(this.x); //10
    }
    foo();
    

    3. 作为构造函数调用

    javaScript 支持面向对象式编程,与主流的面向对象式编程语言不同,JavaScript 并没有类(class)的概念,而是使用基于原型(prototype)的继承方式。相应的,JavaScript 中的构造函数也很特殊,如果不使用 new 调用,则和普通函数一样。作为又一项约定俗成的准则,构造函数以大写字母开头,提醒调用者使用正确的方式调用。如果调用正确,this 绑定到新创建的对象上。

    function Foo() {
      this.x = 10;
      console.log(this); //Foo {x:10}
    }
    var foo = new Foo();
    console.log(foo.x); //10
    

    4. 在 call 或者 apply,bind 中调用

    当一个函数被 call、apply 或者 bind 调用时,this 的值就取传入的对象的值。

    var obj = {
      x: 10,
    };
    function foo() {
      console.log(this); //{x: 10}
      console.log(this.x); //10
    }
    foo.call(obj);
    foo.apply(obj);
    foo.bind(obj)();
    

    5. DOM event this

    在一个 HTML DOM 事件处理程序里,this 始终指向这个处理程序所绑定的 HTML DOM 节点

    function Listener() {
      document.getElementById('foo').addEventListener('click', this.handleClick); //这里的 this 指向 Listener 这个对象。不是强调的是这里的 this
    }
    Listener.prototype.handleClick = function(event) {
      console.log(this); //<div id="foo"></div>
    };
    var listener = new Listener();
    document.getElementById('foo').click();
    

    6. 箭头函数中的 this

    箭头函数内部的 this 是词法作用域,由上下文确定。

    var obj = {
      x: 10,
      foo: function() {
        var fn = () => {
          return () => {
            return () => {
              console.log(this); //Object {x: 10}
              console.log(this.x); //10
            };
          };
        };
        fn()()();
      },
    };
    obj.foo();
    
  • 相关阅读:
    SQL 基础技能提升
    科技领域的assert和deassert的含义
    PDF调出本来存在的书签面板
    什么是事务( Transaction )?
    verilog 和systemverilog的Timing Check Tasks
    PT静态时序分析的三种模式
    useful systemverilog system tasks
    Accellera举措可能导致Verilog标准分化
    验证方法学的发展历程及比较
    PrimeTime 时序分析流程和方法(ZZ)
  • 原文地址:https://www.cnblogs.com/supoer/p/11201916.html
Copyright © 2011-2022 走看看