this问题总结

x33g5p2x  于2022-05-05 转载在 其他  
字(2.5k)|赞(0)|评价(0)|浏览(407)

1、call apply和bind的作用和区别

  1. 作用:
  2. 都可以改变函数内部的this指向。
  3. 区别点:
  4. 1call apply 会调用函数,并且改变函数内部this指向。
  5. 2call apply 传递的参数不一样,call 传递参数arg1,arg2...形式 apply 必须数组形式[arg]
  6. 3bind不会调用函数,可以改变函数内部的this指向。

解析:
call方法
call()方法调用一个对象。简单理解为调用函数的方式,但是它可以改变函数的this指向。

写法:fun.call(thisArg, arg1, arg3, …) // thisArg为想要指向的对象,arg1,arg3为参数

call 的主要作用也可以实现继承

  1. function Person(uname, age) {
  2. this.uname = uname;
  3. this.age = age;
  4. }
  5. function Son(uname, age) {
  6. Person.call(this, uname, age);
  7. }
  8. var son = new Son("zhang", 12);
  9. console.log(son);

apply方法

  1. apply()方法调用一个函数。简单理解为调用函数的方式,但是它可以改变函数的this指向。
  2. 写法:fun.apply(thisArg, [argsArray])
  1. 1thisArg:在fun函数运行时指定的this
  2. 2argsArray:传递的值,必须包含在数组里面
  3. 3、返回值就是函数的返回值,因为他就是调用函数
  1. apply的主要应用,比如可以利用apply可以求得数组中最大值
  2. const arr = [1, 22, 3, 44, 5, 66, 7, 88, 9];
  3. const max = Math.max.apply(Math, arr);
  4. console.log(max);

bind方法
bind()方法不会调用函数,但是能改变函数内部this指向.
写法:

  1. fun.bind(thisArg, arg1, arg2, ...)
  2. 1thisArg:在fun函数运行时指定的this值。
  3. 2arg1,arg2:传递的其他参数。
  4. 3、返回由指定的this值和初始化参数改造的原函数拷贝。
  1. var o = {
  2. name: "lisa"
  3. };
  4. function fn() {
  5. console.log(this);
  6. }
  7. var f = fn.bind(o);
  8. f();
  1. 如果有的函数我们不需要立即调用,但是又需要改变这个函数的this指向,此时用bind再合适不过了。
  2. const btns = document.querySelectorAll("button");
  3. for (let i = 0; i < btns.length; i++) {
  4. btns[i].onclick = function() {
  5. this.disabled = true;
  6. setTimeout(
  7. function() {
  8. this.disabled = false;
  9. }.bind(this),
  10. 2000
  11. );
  12. };
  13. }

扩展:
主要应用场景:

  1. 1call 经常做继承。
  2. 2apply 经常跟数组有关系,比如借助于数学对象实现数组最大值最小值。
  3. 3bind 不调用函数,但是还想改变this指向,比如改变定时器内部的this指向。

2、this指向(普通函数,箭头函数)

  1. 普通函数中的this:
  2. 1、谁调用了函数或者方法,那么这个函数或者对象中的this就指向谁。
  1. let getThis = function () {
  2. console.log(this);
  3. }
  4. let obj={
  5. name:"Jack",
  6. getThis:function(){
  7. console.log(this);
  8. }
  9. }
  10. //getThis()方法是由window在全局作用域中调用的,所以this指向调用该方法的对象,即window
  11. getThis();//window
  12. //此处的getThis()方法是obj这个对象调用的,所以this指向obj
  13. obj.getThis();//obj
  1. 1、匿名函数中的this:匿名函数的执行具有全局性,则匿名函数中的this指向是window,而不是调用该匿名函数的对象;
  1. let obj = {
  2. getThis: function () {
  3. return function () {
  4. console.log(this);
  5. }
  6. }
  7. }
  8. obj.getThis()(); //window

上面代码中,getThi()方法是由obj调用,但是obj.getThis()返回的是一个匿名函数,而匿名函数中的this指向window,所以打印出window。 如果想在上述代码中使this指向调用该方法的对象,可以提前把this传值给另外一个变量(_this或者that):

  1. let obj = {
  2. getThis: function () {
  3. //提前保存this指向
  4. let _this=this
  5. return function () {
  6. console.log(_this);
  7. }
  8. }
  9. }
  10. obj.getThis()(); //obj

3、箭头函数能否当构造函数

  1. 箭头函数表达式的语法比函数表达式更简洁,并且没有自己的thisargumentssupernew.target。箭头函数表达式更适用于那些本来需要匿名函数的地方,并且它不能用作构造函数。

4、继承的优点和缺点?

  1. 继承的好处:
  2. 1、提高代码的复用性
  3. 2、提高代码的维护性
  4. 3、让类与类之间产生了关系,是多态的前提。
  5. 继承的弊端:
  6. 1、类的耦合性增强了,但是开发的原则,高内聚低耦合。

5、new会发生什么?

  1. 1、创建空对象
  2. var obj = {}
  3. 2、设置新对象的constructor属性为构造函数的名称,设置新对象的proto属性指向构造函数的prototype对象。
  4. obj.__proto__ = classA.prototype
  5. 3、使用新对象调用函数,函数的this被指向新实例对象。
  6. classA.call(obj)
  7. 4、返回this指针。当存在显示返回时,返回return后面的内容,新建空对象作废。
  8. function test() {
  9. this.name = "test";
  10. }
  11. test.prototype = {
  12. a:{},
  13. b:{}
  14. }
  15. var c = new test();

相关文章