zoukankan      html  css  js  c++  java
  • 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函数。

  • 相关阅读:
    datasnap的监督功能【3】-TCP链接监督功能
    实体服务规则或值更新设置字段锁定性
    设置指定的单据视图
    启动或停止IIS
    SSMS2014清除登录记录
    未授予用户在此计算机上的请求登录类型
    采购合同手动下推采购订单提示没有NAME属性
    审批流消息中无法获取明细字段
    费用申请单反写费用合同提示第2行总金额超出,但是实际未超出
    调试手机端
  • 原文地址:https://www.cnblogs.com/kaizhadiyishuai/p/12333101.html
Copyright © 2011-2022 走看看