newway007
2019-10-10 10:27
采纳率: 66.7%
浏览 1.0k

关于函数作为参数传入后,this指向问题

var length = 10;
function fn(){
    console.log(this.length);
}
var obj = {
    length: 5,
    method: function (fn1) {
        console.log(arguments[0]());     }
};
obj.method(fn, 123);//输出2

var length = 10;
function fn(){
    console.log(this.length);
}
var obj = {
    length: 5,
    method: function (fn1) {
        console.log(fn1());     }
};
obj.method(fn, 123);//输出10

var length = 10;
function fn(){
    console.log(this.length);
}
var obj = {
    length: 5,
    method: function (fn1) {
        console.log(fn1===arguments[0]);     }
};
obj.method(fn, 123);//输出true

我想问一下,上面两个代码this指向怎么理解?
第一个代码this.length应该是函数参数的个数;这个是为啥?
第二个代码this.length应该是指向全局变量length,这个this为什么不指向obj呢?是obj调用的呀?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

4条回答 默认 最新

  • 瘦子先生 2019-10-10 14:12
    已采纳

    this 有三个指向: 没有对象调用方法时候 this 指向全局就是window

    有对象低调用时 指向那个调用的对象 如果函数碰到new 关键字 那this 就指向 new

    前边的对象

    第一个
    var  length=10
    function fn(){
        console.log(this.length);
    }
    var obj = {
        length: 5,
        method: function (fn1) {
            console.log(arguments[0]());     }
    };
    obj.method(fn, 123);//输出2
    

    obj.method( ) 执行方法 输出console

    arguments 代表的是函数的实参的集合 所以 arguments===[fn,123]

    arguments[0] === fn

    arguments0 ==== fn() 所以外边的函数就执行了 这是后参照this的三个指向 谁调用的fn是arguments
    因为arguments执行的自己第一个参数所以调用的 所以此时 this 执行 arguments this.length 就是arguments的长度 也就是实参的个数2个
    如果obj.method(fn, 123,123)那就是3了

    第二个
    var length = 10;
    function fn(){
        console.log(this.length);
    }
    var obj = {
        length: 5,
        method: function (fn1) {
            console.log(fn1());     }
    };
    obj.method(fn, 123);//输出10
    
    第二个是fn1()执行  根据参数对应  fn1 == fn    fn1() ==  fn()
    此时没有对象让fn()  是自己执行的 所以参照this的3个指向 没有对象调用时指向window 也就是全局 
    而 var length = 10; 实际相当于 window.length = 10  因为window 是顶层对象所以省略了 所以此处是10
    
    点赞 1 评论
  • JonathanYan 2019-10-10 12:51

    fn是全局函数,不管谁掉用它都是全局函数,所以this就是全局的this。
    this指向的永远是定义时候对应的this,不会在运行时根据调用顺序自动绑定,那样就乱套了。

    点赞 评论
  • 第一个地方自然是指的是函数的参数,因为this.length,这里只有全局变量length,和当前函数的局部变量length
    第二个obj.method(fn, 123);此时fn是作为回调函数,它并不是闭包,所以它的变量作用域没有改变,并不会是object,如果你用箭头函数,就不同了。

    点赞 评论
  • D1sappearRy 2019-10-29 09:29
    var obj = {
        length: 5,
        method: function (fn1) {
            console.log(arguments[0]());     }
    };
    

    第一段代码中对象obj的方法method中,虽然声明了形参fn1,但是实际打印中是通过arguements[0]调用,虽然此时fn1 === arguements[0] === fn,但是调用的对象是arguements而不是fn指向的this(即window)。

    第二段代码中对象obj的方法method中,声明了形参fn1,打印也是直接调用fn1() === fn() 执行,而非通过obj.fn()。所以这时函数fn1的this指向window。

    可以在fn代码块内加上console.log(this)
    有意思的是虽然第二段代码this指向window,但打印的值却是0

    点赞 评论

相关推荐 更多相似问题