搜索

首页  >  问答  >  正文

javascript - 关于Js中 this的一道题

var length = 10;

function cl() {
    console.log(this.length);
}

var o = {
    length: 20,
    show: function (fn) {
        fn();
        arguments[0]();
    }
}

o.show(cl); // 10 

关于这道题 我想知道js中this不是谁调用就指向谁么? 为什么 第一次调用 cl中的this还是指向window而不是o对象?我知道没有用call估计就不对了,但是为什么不对呢?
第二个有为什么指向了arguments?

同时 这段代码在nodejs中运行时为什么第一次输出为undifined?

为情所困为情所困2839 天前1046

全部回复(5)我来回复

  • 巴扎黑

    巴扎黑2017-07-05 10:39:50

    1. 直接使用函数名字调用,无论你外面包了多少层,调用者就是window

    2. 因为那个方括号运算符,方括号运算符作为对象取值运算,在某种意义上是可以等于点.运算符的,所以这里在形式上其实可以类比成arguments.0(),你看,这不就是arguments来调用了这个函数了嘛,所以运行的时候this就指向它了。

    回复
    0
  • 欧阳克

    欧阳克2017-07-05 10:39:50

    this的指向不是在声明的时候确定的而是在调用的时候被定义的有这么几种情况

    1. 普通函数调用,this为全局对象或是undefined

    2. 作为对象的方法,this为那个对象

    3. new 表达式,this为以该函数为原型的新创建的对象

    4. 使用 apply/call指定 this

    5. 用bind绑定固定的this

    6. 事件处理函数中的this是当前的触发事件的DOM元素(event.currentTarget)

    不知道对你有没有帮助

    回复
    0
  • 扔个三星炸死你

    扔个三星炸死你2017-07-05 10:39:50

    就这道题而言。

    1. o.show()执行,那么show函数作用域里面用到的this都指向 o.
      但其实这里是在里面调用fn(), fn并不是o去调用的,没有o.fn... 一个比较low的原则就是函数调用点前面是谁,函数里面的this就是谁。 这里肯定是默认的window了。

    2. arguments[0] ==> arguments.0
      数组也是对象,[]调用跟 . 同理,所以this就是arguments

    3. 关于node中,由于是模块化,this指向的是global,而且var 声明的时候不会像浏览器中,有window调用。node中是没有这个机制的。

    回复
    0
  • 巴扎黑

    巴扎黑2017-07-05 10:39:50

    雷雷

    回复
    0
  • 我想大声告诉你

    我想大声告诉你2017-07-05 10:39:50

    o.show()this指向o,但和本题无关。
    o.show()中的fn标识符解析得到一个引用类型(内部类型),其base属性(本题中值为show()方法的活动对象)即是this的指向。因为活动对象返回null,所以this指向null,从而指向了window
    arguments[0]()arguments[0]同样返回一个引用类型,其base属性的值为arguments,所以this指向arguments

    回复
    0
  • 取消回复