常见问题/知识点记录(一)

一 call apply bind

相同点:
都可以改变函数内部的this指向
区别点:

  1. call和apply会调用函数 并且改变函数内部this指向
  2. call和apply传递的参数不一样 call传递参数 arg1,arg2…形式 apply是数组形式
  3. bind不会调用函数 可以改变this指向 传值方式类似call

主要应用场景:

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

call和apply哪个性能更好一些?
两个传参数 <=3 个的时候 性能差不多 >3 的时候 call的性能比apply性能相对要好一些
一般后期开发 使用call多一点

call–前面的参数值作用域对象 后面的参数可以是多个
apply–第一个参数是作用域对象 第二个参数必须是数组
bind–绑定一个作用域 但不是立即执行

var b = a.fn
var c = b.bind(a,1,2)
c() // c的作用域是a

二 什么是高阶函数

一. 函数作为参数
二. 函数作为返回值

三 箭头函数与普通函数(function)的区别是什么?

  1. 箭头函数语法比普通函数更加简洁
  2. 箭头函数没有自己的this 它里面的this继承函数所属上下文中的this call和apply等任何方法都无法改变this指向
  3. 箭头函数中没有arguments(类数组) 只能…arg获取传递的参数集合
  4. 箭头函数不能被new执行 因为箭头函数没有自己的this和prototype

四 函数的不同调用方式的this指向

  1. 普通函数调用
fn();// this指向window
  1. 方法调用
obj.fn(); // this指向obj
  1. 作为构造函数调用 构造函数内部的this指向由该构造函数创建的对象
  2. 作为事件处的处理函数
btn.onClick=function(){}; // 触发该事件的对象
  1. 作为定时器的参数
setInterval(function(){},1000) // this指向window

总结:函数内部的this不是书写的时候决定的 是由函数调用的时候来确定其指向的

改变this指向
this 指针 当前对象(作用域对象) 没有调用者就是window

  1. 箭头函数
  2. 声明一个变量保存指针 var that = this
  3. call 执行一个函数 函数名.call(xx) 将函数放到特定作用域对象中执行
  4. apply 函数名.apply(作用域对象)

五 严格模式 strict mode

  1. 消除了js语法的一些不合理 不严谨之处 较少了一些怪异行为
  2. 消除代码运行的一些不安全之处 保证代码运行的安全
  3. 提高编译器效率 增加运行速度
  4. 禁用了在ECMAScript的未来版本中可能会定义的一些语法 为未来新版本Javascript做好铺垫 如保留字如 class export extends import super 不能做变量名
    开启严格模式
'use strict' // 下面就会安装严格模式执行代码

严格模式下的 变量

  1. 必须先声明 再使用
  2. 不能随意删除已经声明的变量

严格模式this指向问题

  1. 全局作用域中的this是undefined
  2. 如果构造函数不加new调用 this指向的是undefined
  3. 定时器this还是指向window

函数的变化

  1. 不允许函数的参数重名
  2. 不允许在非函数代码块内声明函数
发布了41 篇原创文章 · 获赞 2 · 访问量 1836

猜你喜欢

转载自blog.csdn.net/weixin_43883485/article/details/104703751