newway007 2019-10-10 10:27 采纳率: 66.7%
浏览 1169
已采纳

关于函数作为参数传入后,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
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器