为了账号安全,请及时绑定邮箱和手机立即绑定

一道关于javascript this指向问题

一道关于javascript this指向问题

收到一只叮咚 2019-03-15 18:13:34
一道关于javascript指针的题目,求详细的解答分析。var length = 10;function fn(){    alert(this.length)}var obj = {    length: 5,    method: function(fn){        fn() // ?        arguments[0]() // ?    }}obj.method(fn)
查看完整描述

9 回答

?
元芳怎么了

TA贡献1798条经验 获得超7个赞

var length = 10;

function fn() {

  console.log('fn:', this);

  console.log('fn:', this.length);

var obj = {

  length: 5,

  method: function(fn) {

    fn() // ?

    console.log(arguments[0]);

    arguments[0](); // ?

  }

};


obj.method(fn);

这样会清楚一点。第一个fn()由于没有对象上下文,所以直接调用fn()时其this指向的是全局的window或process,所以打印出来的length是全局的,也就是10。第二个arguments[0]()则有了对象上下文arguments,此时其this指向arguments,从而打印出来的length其实是arguments.length,即为1,


查看完整回答
反对 回复 2019-03-24
?
红颜莎娜

TA贡献1842条经验 获得超12个赞

如果直接把这段代码放在html里面的script标签里面,length就是全局变量了,可以在windows下面看到length。


var length = 10;

function fn(){

    alert(this.length)

}

var obj = {

    length: 5,

    method: function(fn){

        fn() // 这里输出的是你定义的windows下面全局变量length 10

        arguments[0]() // 这里arguments的length为1,而fn 里面的this指向arguments,所以输出1.

    }

}


查看完整回答
反对 回复 2019-03-24
?
UYOU

TA贡献1878条经验 获得超4个赞

第一个直接调用fn,this指向window。第二个arguments[0](),相当于一个对象调用自身的某个属性函数(类似obj.fn(),fn函数中的this会指向obj。),所以第二个this指向arguments。


查看完整回答
反对 回复 2019-03-24
?
喵喵时光机

TA贡献1846条经验 获得超7个赞

var length = 10;

function fn(){

    alert(this.length)

}

var obj = {

    length: 5,

    method: function(fn){

        fn() // 10 指向 window

        arguments[0]() // 1 指向 arguments

    }

}

obj.method(fn)

第一个问题:fn() 指向这个知识点:

任意函数里如果嵌套了 非箭头函数,那这个时候 嵌套函数里的 this 在未指定的情况下,应该指向的是 window 对象

第二个问题:arguments[0]()指向这个知识点:

在方法调用(如果某个对象的属性是函数,这个属性就叫方法,调用这个属性,就叫方法调用)中,执行函数体的时候,作为属性访问主体的对象和数组便是其调用方法内 this 的指向。(通俗的说,调用谁的方法 this 就指向谁;)

这个地方,可能会让人迷惑,arguments[0]指向 fn,所以 arguments[0]() 是作为 arguments对象的属性[0]来调用 fn的,所以 fn 中的 this 指向属性访问主体的对象 arguments

举个例子:

[function fn(){alert(this.length)}][0]()//1

数组也是对象,只不过数组对象的整型属性会计入 length 属性中,并被区别对待,这里就是调用数组对象的0属性,函数作为数组对象的属性调用,函数中的this 当然指向这个数组,所以返回数组的length ,当然是 1;

其他详情戳js 中 this 的指向问题


查看完整回答
反对 回复 2019-03-24
?
神不在的星期二

TA贡献1963条经验 获得超6个赞

楼上的说得很对,这里告诉楼主一句话判断this指向问题: 谁调用的,this就指向谁,没有调用者,非严格模式下就是window,否则undefined


查看完整回答
反对 回复 2019-03-24
?
子衿沉夜

TA贡献1828条经验 获得超3个赞

我感觉fn()你应该是会的,函数的直接调用。


arguments[0]()可以看下这个。


var obj = {

    fn: function () {console.log(this)}

    1: function () {console.log(this)}

}

obj.fn()

obj[1]()

// 这俩调用没什么区别,都是对象方法的调用,arguments[0]()同理


查看完整回答
反对 回复 2019-03-24
?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

第一个指向window,第二个指向method


查看完整回答
反对 回复 2019-03-24
?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

第一个fn()this指向win win对象的length属性并没有定义值,所以返回undefined,第二个this指向argumengts对象,因为fn作为一个参数存储在arg对象里,argumengts的长度为1


查看完整回答
反对 回复 2019-03-24
?
莫回无

TA贡献1865条经验 获得超7个赞

正确答案是:


undefined

1

第一个好理解,function在没有绑定this前,都指向window对象。

第二个,必须理解arguments这个参数。指的是function的所有实参,与形参无关。也就是调用函数时,实际传入的参数,以对象形式存在:{"0": "", "1": ""},本题中的值为:{ '0': [Function: fn] }。那么arguments[0]就是[Function: fn],当调用arguments[0]()时,this指向的是arguments对象,相当于调用了arguments.length,所以值为1


查看完整回答
反对 回复 2019-03-24
  • 9 回答
  • 0 关注
  • 469 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信