05面试编JavaScript- this指向

54 阅读2分钟

面试编JavaScript 05 - this

this的绑定规则一共有5种:

①默认绑定

②隐式绑定

③显示(硬)绑定

④new 绑定

⑤ES6新增的箭头函数绑定

①默认绑定

默认绑定通常指函数独立调用,不涉及其他绑定规则。非严格模式下,this指向window,严格模式下,this指向undefined。

②隐式绑定

函数的调用是在某个对象上触发的,即调用位置存在上下文对象,通俗点说就是“XXX.func()”这种调用模式。

此时func的this指向XXX,但如果存在链式调用,例如XXX.YYY.ZZZ.func,记住一个原则:this永远指向最后调用它的那个对象

③隐式绑定的丢失

隐式绑定会发生一般常见的两种丢失:

1.使用另外一个变量作为函数别名,之后使用别名执行函数

2.将函数作为参数传递时会被隐式赋值

④显示绑定

就是通过call(),apply(), bind() 等方法,强行改变this指向;

这三个都可以改变this指向,却有些差别:

1.call()和apply()函数会立即执行

2.bind()函数会返回新函数,不会立即执行函数

3.call()和apply()的区别在于call接受若干个参数列,apply接受数组

⑤显示绑定扩展

⑥new绑定

使用new来构造函数,会执行以下四步操作:

1.创建一个空的简单JavaScript对象({})

2.为步骤一新创建的对象添加属性_proto_,将该属性链接至构造函数的原型对象

3.将步骤1新创建的对象作为this的上下文

4.如果该函数没有返回对象,则返回this

通过new来调用构造函数,会生成一个新对象,并且把这个新对象绑定为调用函数的this

⑦箭头函数

箭头函数没有自己的this,它的this指向外层作用域的this,且指向函数定义时的this而非执行时。

1.指向外层作用域的this: 箭头函数没有this绑定,但它可以通过作用域链查找到外层作用域的this

2.指向函数定义时的this而非执行时: JavaScript是静态作用域,就是函数定义后,作用域就是定死了,跟它执行时的地方无关,

⑧箭头函数扩展

1.箭头函数没有this,它的this是通过作用域链查到外层作用域的this,且指向函数定义时的this而非执行时。

2.不可以用构造函数,不能使用new命令,否则会报错。

3.箭头函数没有arguments对象,如果要用,使用rest参数代替

4.不可以使用yield命令,因此箭头函数不能用作Generator函数

5.不能用call/apply/bing修改this指向,但可以通过外层作用域的this来间接修改

6.箭头函数没有prototype属性