zoukankan      html  css  js  c++  java
  • this —— javascript

    目录

    为什么要讨论this

     代码一:

    function fun1(){
        var aa = 'I am aa';
        console.log(this.aa)
    }
    fun1();

    会打印出什么呢?是 ' I am aa ' 吗,

    结果是:

    undefined

    原因:

    此时 this 指向 window 对象,

    this.aa 等同于 window.aa

    aa 是局部变量,该值只在函数内部有效,

    window.aa 访问的是全局属性,访问不到函数内部的值,因此会打印 undefined

     代码二:

    var fun2 = function(){
        console.log(this.name);
    }
    
    var name = 'I am x - global';
    
    var obj2 = {
        name: 'I am x - local',
        ff: fun2
    }
    
    fun2();
    obj2.ff();

    结果是:

    I am x - global
    I am x - local

    fun2() 等同于 window.fun2() ,直接调用函数,此时所处 this 指向 window

    obj2.ff() 通过 obj2 对象访问其方法,这时 this 指向 obj2

    代码三:

    var fun2 = function(){
      console.log(this.name);
    }
    
    var name = 'I am x - global';
    
    var obj2 = {
      name: 'I am x - local',
      ff: fun2,
      ff2: function(){
        function fun3(){
          console.log(this.name)
        }
        fun3();
      }
    }
    
    fun2();           // global
    obj2.ff();        // local
    obj2.ff2();       // 

    结果:

    I am x - global
    I am x - local
    I am x - global

    就如下面定义所说的,

    this 指向包含它的函数作为方法被调用时所属的对象。

    此时 fun3 为函数,并非为绑定到对象上的方法。

    this是什么

    定义:this是指包含它的函数作为方法被调用时所属的对象。

    个人理解:被调用时所处的上下文。

    如何改变this的指向

    • call()
    • apply()

    代码四:

    var name = "global name";
    var obj1 = {
        name: 'obj1'
    }
    var obj2 = {
        name: 'obj2'
    }
    function myName(){
        console.log(this.name);
    }
    
    myName()
    myName.call(obj1)
    myName.call(obj2)

    结果:

    global name
    obj1
    obj2

    call 改变了 this 的指向

    callapply 的区别

    接受参数方式不同

    Object.call(obj, arg1, arg2, arg3)

    Object.apply(obj, [arg1, arg2, arg3])

    箭头函数中的this

     箭头函数中,修复了 this 的指向,

    箭头函数函数声明存在于对象方法时,

    此时 this 的指向不再是 window undefined

    而是这个对象本身。

    看一段代码就明白了: 

    代码五:

    var name = 'I am x - global';
    
    var obj2 = {
        name: 'I am x - local',
        ff2: function(){
            var fun3 = function(){
                console.log(this.name)
            }
            var fun4 = () => {
                console.log(this.name)
            }
            fun3();
            fun4();
        }
    }
    
    obj2.ff2();

    结果:

    I am x - global
    I am x - local

    箭头函数中的 call()

    直接来看一段代码吧

    代码六:

    var name = 'I am x - global';
    
    var obj2 = {
        name: 'I am x - local',
        ff2: function(){
            var fun3 = function(){
                console.log(this.name)
            }
            var fun4 = () => {
                console.log(this.name)
            }
            fun3();        // global
            fun4();        // local
            fun3.call({name:'new name1'})    // 看这里
            fun4.call({name:'new name2'})    // 看这里
        }
    }
    
    obj2.ff2();

    结果:

    I am x - global
    I am x - local
    new name1
    I am x - local

    用 call() 或 apply() 调用箭头函数时,

    将无法对 this 进行绑定,

    传入的第一个参数将会被忽略。

  • 相关阅读:
    nodeType 节点简介
    Hamming Codes
    Preface Numbering(还没好好看USACO的解答)
    位运算常见应用即ACM题优化实例
    Dynamic Programming(动态规划)
    operator new & new operator
    资料记录
    Ordered Fractions
    Healthy Holsteins
    Sorting A ThreeValued Sequence
  • 原文地址:https://www.cnblogs.com/mu159/p/11290073.html
Copyright © 2011-2022 走看看