一 call apply bind
相同点:
都可以改变函数内部的this指向
区别点:
- call和apply会调用函数 并且改变函数内部this指向
- call和apply传递的参数不一样 call传递参数 arg1,arg2…形式 apply是数组形式
- bind不会调用函数 可以改变this指向 传值方式类似call
主要应用场景:
- call经常做继承
- apply经常跟数组有关系 比如借助于数学对象实现数组最大最小值
- 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)的区别是什么?
- 箭头函数语法比普通函数更加简洁
- 箭头函数没有自己的this 它里面的this继承函数所属上下文中的this call和apply等任何方法都无法改变this指向
- 箭头函数中没有arguments(类数组) 只能…arg获取传递的参数集合
- 箭头函数不能被new执行 因为箭头函数没有自己的this和prototype
四 函数的不同调用方式的this指向
- 普通函数调用
fn();// this指向window
- 方法调用
obj.fn(); // this指向obj
- 作为构造函数调用 构造函数内部的this指向由该构造函数创建的对象
- 作为事件处的处理函数
btn.onClick=function(){}; // 触发该事件的对象
- 作为定时器的参数
setInterval(function(){},1000) // this指向window
总结:函数内部的this不是书写的时候决定的 是由函数调用的时候来确定其指向的
改变this指向
this 指针 当前对象(作用域对象) 没有调用者就是window
- 箭头函数
- 声明一个变量保存指针 var that = this
- call 执行一个函数 函数名.call(xx) 将函数放到特定作用域对象中执行
- apply 函数名.apply(作用域对象)
五 严格模式 strict mode
- 消除了js语法的一些不合理 不严谨之处 较少了一些怪异行为
- 消除代码运行的一些不安全之处 保证代码运行的安全
- 提高编译器效率 增加运行速度
- 禁用了在ECMAScript的未来版本中可能会定义的一些语法 为未来新版本Javascript做好铺垫 如保留字如 class export extends import super 不能做变量名
开启严格模式
'use strict' // 下面就会安装严格模式执行代码
严格模式下的 变量
- 必须先声明 再使用
- 不能随意删除已经声明的变量
严格模式this指向问题
- 全局作用域中的this是undefined
- 如果构造函数不加new调用 this指向的是undefined
- 定时器this还是指向window
函数的变化
- 不允许函数的参数重名
- 不允许在非函数代码块内声明函数