• Js中的this指向问题


    Js中的this指向问题

    this的指向在函数刚定义的时候是没发确定的,只有在函数执行的时候才能确定this到底指向谁。也就是说this最终指向的是调用它的那个对象

    Example 1:

    function fn1(){
        let name = 'mike'
        console.log(name) //mike
        console.log(this.name) //undefined
        console.log(this) //window
    }
    fn1()
    

    如果一个函数的调用方式为fn1(),它是相当于window.fn1()。所以函数fn1中的this指向的是window,那么window下没有name这个变量所以当打印this.name的时候自然等于的是undefined

    Example 2:

    let fn1 = {
    	name:'mike',
    	fn2:function(){
    		console.log(this)// 指向函数fn1
    		console.log(this.name)// mike
    	}
    }
    fn1.fn2()
    

    函数fn2是通过函数fn1调用执行的,所以当前的this指向的是函数fn1

    Example 3:

    let fn1 = {
        name:'mike',
        fn2:function(){
            console.log(this)// 指向函数fn1
            console.log(this.name)// mike
        }
    }
    window.fn1.fn2()
    

    到这里你可能会问了这里的this为什么指向的不是windowthis最终指向的不是调用它的对象吗

    window对象是js中的一个全局对象,实际我们声明变量都是再给window添加属性

    再看Example 4:

    let fn1 = {
        name:'mike',
        obj:{
            name:'russ',
            fn2:function(){
                console.log(this)// 指向obj
                console.log(this.name)// russ
            }
        }
    }
    fn1.obj.fn2()
    

    这里也是fn1执行调用的,但是this同样没有指向它
    this指向的问题可分为三种情况:

    1. 如果一个函数中存在着this,但是没有被任何对象进行调用,那么它一定指向的是window
    2. 如果一个函数中存在着this,但被它的上一级调用了,那么它指一定向的是上一级的作用域
    3. 如果一个函数中存在着this,但是这个函数包含着多个对象,尽管这个函数是被最外层的对象所调用,它也一定指向的是它的上一级的作用域(如例4)

    但还存在着一种特殊的情况 Example 5:

    let fn1 = {
        name:'mike',
        obj:{
            name:'russ',
            fn2:function(){
                console.log(this)// window
                console.log(this.name)// undefined
            }
        }
    }
    let fn3 = fn1.obj.fn2()
    fn3()
    

    懵了!这里为什么又是指向的window.根据例4我们可以得出this指向的永远是最后调用他的那个对象,例5中虽然函数fn2是被对象obj所引用,但是在将fn2赋值给变量fn3的时候并没有执行所以最终指向的是window

    构造函数的this指向:

    function fn1 () {
        this.name = 'mike'
    }
    let fn2 = new fn1()
    console.log(fn2.name)// mike
    

    这里fn2能直接访问fn1里面的name属性是因为构造函数的关键字new可以改变this的指向。为什么说fn2是一个对象而例5却不是,主要原因还是在于new关键字创建的是一个实例对象,调用函数fn1的是fn2对象,既然是对象,那么this自然指向的是fn2。为什么fn2中会有name属性,因为用了new相当于等同的复制了fn1函数。

  • 相关阅读:
    ZOJ 3332 Strange Country II
    ZOJ 3331 Process the Tasks(双塔DP)
    ZOJ 3326 An Awful Problem(模拟)
    HDU 1796 How many integers can you find(容斥原理)
    HDU 4059 The Boss on Mars(容斥原理)
    HDU 4135 Co-prime(容斥原理)
    HDU 5677 ztr loves substring(回文串加多重背包)
    CodeForces 668B Little Artem and Dance
    CodeForces 667A Pouring Rain
    Java实现 LeetCode 764 最大加号标志(暴力递推)
  • 原文地址:https://www.cnblogs.com/kaizhadiyishuai/p/12333101.html
Copyright © 2020-2023  润新知