视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
用最简单的方法判断JavaScript中this的指向(推荐)
2020-11-27 22:31:15 责编:小采
文档

都说 JavaScript 是一种很灵活的语言,这其实也可以说它是一个混乱的语言。它把 函数式编程 和 面向对象编程 糅合一起,再加上 动态语言 特性,简直强大无比(其实是不能和C++比的,^_^ )。

JS 里的 this

  • 在 function 内部被创建
  • 指向调用时所在函数所绑定的对象(拗口)
  • this 不能被赋值,但可以被 call/apply  改变
  • 目录

    * 一个特例
    * 开始判断
        * 法则一:对象方法中的this指向对象本身(箭头函数形式的除外)
        * 法则二:多层嵌套函数中的this指向等同于包含该this的最近一个function的this
        * 法则三:箭头函数以及非指向对象方法中的function的情况下this指向window
    * 习题集
        * 普通函数中的this
        * 函数执行后返回另外一个函数中的this(普通函数中)
        * 多层嵌套函数中的this(定时器&箭头函数)1
        * 多层嵌套函数中的this(定时器&箭头函数)2

    一个特例

    在正式开始之前,我们先来说一个特例。

    // 构造函数
    function Student(name) {
     this.name = name
    }
    // 创建小明和小红两个实例
    var XM = new Student('xiaoming')
    var XH = new Student('xiaohong')
    // 
    输出信息 console.log(XM) // Student {name: "xiaoming"} console.log(XH) // Student {name: "xiaohong"}

    在构造函数中,this上的值会在创建实例的时候被绑定到新创建的实例上。不适用于下面的判断方法,所以特此说明。

    开始判断

    下面是一个典型例子,我们的分析从这里开始。

    var x = {
     name: 'bw2',
     getName1: function() {
     console.log(this)
     },
     getName2: function() {
     setTimeout(() => {
     console.log(this)
     },0)
     },
     getName31: () => {
     console.log(this)
     },
     getName32: function() {
     return function() {
     console.log(this)
     }
     }
    }
    x.getName1() // {name: "bw2", getName1: ƒ}
    x.getName2() // {name: "bw2", getName1: ƒ}
    x.getName31() // Window {stop: ƒ, open: ƒ, alert: ƒ, confirm: ƒ, prompt: ƒ, …}
    x.getName32()() // Window {stop: ƒ, open: ƒ, alert: ƒ, confirm: ƒ, prompt: ƒ, …}

    法则一:对象方法中的this指向对象本身(箭头函数形式的除外)

    var x = {
     name: 'bw2',
     getName1: function() {
     console.log(this)
     }
    }
    x.getName1() // {name: "bw2", getName1: ƒ}

    法则二:多层嵌套函数中的this指向等同于包含该this的最近一个function的this

    箭头函数没有的this作用域,所以继续往外层走,走到了getName: function(){}。那么就是他了,this指向等同于这个function内部的this指向。根据法则一,this指向对象本身。

    var x = {
     name: 'bw2',
     getName2: function() {
     console.log(this) // 等同于此处的this
     setTimeout(() => {
     console.log(this) // 原始的this位置
     },0)
     }
    }
    x.getName2() // {name: 'bw2', getName1: ƒ}

    我们可以试着在浏览器中运行,看看结果。

    法则三:箭头函数以及非指向对象方法中的function的情况下this指向window

    根据法则二,this是指向最近的function,因此,这里的this等同于返回的函数中的this,不是对象方法中的this,所以,指向全局。

    是不是感觉有点奇怪?不过实践证明确实如此。

    var x = {
     name: 'bw2',
     getName31: () => {
     console.log(this)
     },
     getName32: function() {
     return function() {
     console.log(this)
     }
     }
    }
    x.getName31() // Window {stop: ƒ, open: ƒ, alert: ƒ, confirm: ƒ, prompt: ƒ, …}
    x.getName32()() // Window {stop: ƒ, open: ƒ, alert: ƒ, confirm: ƒ, prompt: ƒ, …}

    习题集

    欢迎大家按照法则一到三依次判断,猜测结果,并在浏览器下测试。测试结果也可以回复,大家一起讨论。

    因本人能力有限,该系列法则可能在部分情况下失效。欢迎大家一起讨论。

    下面是做题时间。

    普通函数中的this

    function x() {
     console.log(this)
    }
    x()

    函数执行后返回另外一个函数中的this(普通函数中)

    function xx(){
     return function() {
     console.log(this)
     }
    }
    xx()()

    多层嵌套函数中的this(定时器&箭头函数)1

    var x = {
     name: 'bw2',
     getName: () => {
     setTimeout(() => {
     console.log(this)
     },0)
     }
    }
    x.getName()

    多层嵌套函数中的this(定时器&箭头函数)2

    var x = {
     name: 'bw2',
     getName: () => {
     setTimeout(function() {
     console.log(this)
     },0)
     }
    }
    x.getName()

    再次说明,该法则为实验性法则,未进行大范围的测试,不保证在所有情况下都有一致的结果。如果你发现了法则判断失败的情况,欢迎留言,一起探讨。

    总结

    以上所述是小编给大家介绍的Mysql 5.7.19 winx ZIP Archive 安装及使用教程,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

    下载本文
    显示全文
    专题