关于this的一道面试题
Nov 10, 2017
直接上题目:
1 | var length = 10; |
乍一看,题目很简单,答案应该是 10 10 5
,可是,正确答案应该是10 2 5
。下面来分析一下:
js中主要有四种this绑定的类型,分别如下:
1、默认绑定
2、隐式绑定
3、显示绑定
4、new绑定
1、默认绑定:在什么都匹配不到的情况下,非严格模式this
绑定到全局对象或者global
,严格模式绑定到undefined
;
2、隐式绑定:方法作为对象的属性调用时,方法体中的this绑定到对象身上;
3、显示绑定:通过call
或者apply
调用的方法,其内部的this
绑定为call
或apply
的第一个参数;
4、new
绑定:在创建对象过程中,new
会使得构造函数以及原型链中的方法内部的this
绑定到当前正在创建的对象身上。
回到题目身上,obj.method(fn, 1)
运行之后,函数内部首先运行fn()
,很明显,这个时候直接调用fn
,那么fn
内部的this
就绑定到了window
身上(或者理解成由window
调用fn
),所以答案是10;接下来,arguments[0]()
,arguments
在js中属于类数组对象,具有length
属性,但不具有数组的一些方法,很明显,arguments[0]()
运行的就是fn()
,那这个地方是由谁调用fn
的呢?答案是由arguments
来调用,这里fn
作为arguments
的内部的一部分,由arguments
调用,所以此时fn
内部的this
就指向了arguments
,而这一步中的arguments
的length
属性值为2,所以答案是2;最后一问,使用了call
来将fn
中的this
显示绑定到obj
身上,所以,答案就是obj
的length
属性,结果为5。