函数的 this 指向 (面试必问)
每一个函数内部都有一个关键字是 this
重点: 函数内部的 this 只和函数的调用有关, 和函数的定义方式没有任何关系
换句话说: 函数内部的 this 指向谁, 取决于函数的调用方式
刚才我们说的都是函数的基本调用方式里面的 this 指向
我们还有三个可以忽略函数本身的 this 指向 转而指向其他地方的 三个方法
call
这个方法是附加在函数调用后面使用, 可以忽略函数本身的 this 指向
语法: 函数名.call(新的 this 指向, 传递给函数本身的参数1, 传递给函数本身的参数2, 传递给函数本身的参数3, ...)
apply
这个方法是附加在函数调用后面使用, 可以忽略函数本身的 this 指向
语法: 函数名.apply(新的 this 指向, [传递给函数本身的参数1, 传递给函数本身的参数2, 传递给函数本身的参数3, ...])
bind
这个方法是附加在函数调用后面使用, 可以忽略函数本身的 this 指向
bind 和 call/apply 有一点小区别, 就是 bind 不会立即执行函数, 而是返回一个已经改变了 this 指向的函数
语法: var newFn = 函数名.bind(新的 this 指向); newFn(传递函数需要的参数)
面试题:
1. 请你简单描述一下 函数 内部 的 this 指向问题
2. 如何修改函数内部 this 指向?
3. call / apply / bind 三个方法的区别
什么是 ES6
其实就是 JS 发展过程中的某一个版本号
举例:
- 微信 在最初的版本中并没有所谓的 微信支付
- 但是随着时间的流逝, 微信也在一版一版的迭代更新
- 然后微信在更新的过程中的某一个版本, 推出了 微信支付
JS:
- JS 在最初的版本中并不是像现在一样具备很完善的功能
- 但是随着时间的流逝, JS 也在 一版一版的迭代更新
- 然后再 版本号为 ES6 这一个版本的时候, 推出了很多好用的而且常用的 功能
- 但是后续也还有新的版本推出, ES7 ES8 ES9...
- 因为后续版本更新的内容每年一次, 但是内容方法不多, 所以也没有人特别记忆这个方法是 ES7还是ES8
- 我们统称为 ES6 的方法, 或者 ES6+ 的方法
- 再 ES6 刚出的时候, 因为浏览器是浏览器厂商生产的, 所以有些功能浏览器还暂时不支持
- 所以当时写的时候还需要考虑兼容性, 比如当前浏览器是否支持 ES6
- 但现在基本所有主流浏览器都全面支持 ES6 了
延伸一道面试题:
ES6 新增的方法中, 你了解过那些
let与const 关键词 延伸一道面试题:ES6新推出的 let和const 这两个方法与之前的var 有什么区别
以前声明变量一直使用的var 关键字来声明变量
在ES6的时候多了两个关键字 let/const 也是用来声明变量
语法 let 变量名; const 变量名
和var 的区别
1.let 和const 不允许重复声明变量
2.let和const 声明变量的时候不会出现变量提升
3.let和const 声明的变量会被所有的代码块{} 限制作用范围
let 与 const的区别
1.let声明的变量的值可以改变,const声明的变量的值不可以被改变,所以我们以把const声明的变量叫做”常量“
2.let 定义的变量 可以不赋值,但是 const 定义的变量必须赋值
变量提升:
在定义变量前去使用这个变量时,如果是通过var 这个关键字定义的变量,那么就会出现变量提升
也就是说能用这个变量,但是没有实际的值,得到的值为 undefined
但是如果是通过 let 或者 const 定义的变量 则不会出现变量提升,也就是说在定义前使用变量,浏览器会报错
箭头函数
箭头函数是 ES6 里面一个简写函数的语法方式
重点 箭头函数只能简写 函数表达式, 不能简写声明式函数
语法: (函数的形参) => {函数体内要执行的代码}
箭头函数的特殊性 (一道面试题: 箭头函数与普通函数有什么区别?)
1. 箭头函数内部没有 this, 箭头函数的 this 是书写时所在位置的 this 值
2. 箭头函数内部没有 arguments 这个参数集合
3. 如果形参只有一个的时候, 小括号可以不写, 如果有多个形参或者没有形参的时候, 小括号必须写
4. 函数体只有一行代码的时候, 可以不写 {}, 并且会自动 return
解构赋值
就是快速的从对象或者数组中取出成员的一个语法方式
解构赋值的注意点!
{} 是专门解构对象使用的
[] 是专门解构数组使用的
两个不能混用