函数内部定义的函数的this指向问题

    var a = 100;
    var o = {
        a: 10,
        fn1: function () {
            console.log('1---> ' + this.a);

            function fn2() {
                console.log('2---> ' + this.a);
                fn3()

                function fn3() {
                    console.log('3---> ' + this.a);
                }
            }
            fn2()
        }
    }

    o.fn1()

输出结果:
图片.png
o.fn1(),输出结果是10我是知道的,因为是对象o进行调用的,所以o.fn1的this指向对象o;
但是fn1里面定义的函数的this指向为什么都是指向了全局对象?

阅读 2.8k
4 个回答

在一个函数上下文中,this由调用者提供,由调用函数的方式来决定。
如果调用者函数,被某一个对象所拥有,那么该函数在调用时,内部的this指向该对象。
调用 fn1 的时候,是通过 o.fn1(), 所以在 fn1 中,this指向了 o。

如果函数独立调用,那么该函数内部的this,则指向undefined。
但是在非严格模式中,当this指向undefined时,它会被自动指向全局对象。

fn2 和 fn3 是直接调用的,并且这个是在非严格模式下,所以他们的 this是指向全局的,所以 显示a为100

你好,调用 fn1 的时候,是通过 o.fn1(), 所以在 fn1 中,this指向了 o

fn2 和 fn3 是直接调用的,他们的 this是指向全局的,所以 显示a为100

新手上路,请多包涵

this的四种绑定方式去:默认绑定,隐式绑定,显式绑定,new绑定

  • 隐式绑定:obj.fn()这种结构就是隐式绑定,fn的this会绑定到obj上

    • 在上面的o.fn1()的代码中,fn1函数中的代码属于“隐式绑定”,fn1中的this值被绑定到o对象上。
  • 显式绑定:类似 fn.call(obj)这种结构,除call外还有apply,bind。fn的this值会被绑定到obj上
  • new绑定:类似 obj = new fn() 这种结构,fn的this会绑定到obj上
  • 默认绑定:非严格模式下不加修饰的调用函数就会使用默认绑定,绑定到全局对象上。

    • 上面的fn2,fn3都是通过这种方法调用的

需要注意的是:

        let obj = {
            fn: function () {
                console.log(this)
            }
        }

        setTimeout(obj.fn, 0); // window

类似上面这种代码,虽然obj.fn来获取到了函数在堆内存中的位置,但是setTimeout在调用的时候并不是通过obj.fn()这种方式来调用的。js函数的参数都是按值传递,setTimeout函数更类似于下面这种:

        function setTimeout(fn, delay) {
            // 等待delay秒后
            fn()
        }

这里只是实现了 fn=obj.fn的参数赋值,调用依然是采用默认绑定的方式进行调用,所以this依然绑定在window对象上。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
1 篇内容引用
推荐问题
宣传栏