(记录笔记)
- this关键字
什么是 this?this 是 JavaScript 的一个关键字,一般指向调用它的对象。
这句话其实有两层意思,首先 this 指向的应该是一个对象,更具体地说是函数执行的“上下文对象”。其次这个对象指向的是“调用它”的对象,如果调用它的不是对象或对象不存在,则会指向全局对象(严格模式下为 undefined)。
ES6 新加入的箭头函数不会创建自己的 this,它只会从自己的作用域链的上一层继承 this。
改变 this 指向的常见 3 种方式有 bind、call 和 apply。call 和 apply 用法功能基本类似,都是通过传入 this 指向的对象以及参数来调用函数。区别在于传参方式,前者为逐个参数传递,后者将参数放入一个数组,以数组的形式传递。bind 有些特殊,它不但可以绑定 this 指向也可以绑定函数参数并返回一个新的函数,当 c 调用新的函数时,绑定之后的 this 或参数将无法再被改变。
- typeof
用来获取一个值的类型,可能的结果有下面几种:
类型 结果
Undefined "undefined"
Boolean "boolean"
Number "number"
BigInt "bigint"
String "string"
Symbol "symbol"
函数对象 "function"
其他对象及 null "object"
- instanceof
用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。例如,在表达式 left instanceof right 中,会沿着 left 的原型链查找,看看是否存在 right 的 prototype 对象。
- 命名提升
对于使用 var 关键字声明的变量以及创建命名函数的时候,JavaScript 在解释执行的时候都会将其声明内容提升到作用域顶部,这种机制称为“命名提升”。
变量的命名提升允许我们在同(子)级作用域中,在变量声明之前进行引用,但要注意,得到的是未赋值的变量。而且仅限 var 关键字声明的变量,对于 let 和 const 在定义之前引用会报错。
console.log(a) // undefined
var a = 1
console.log(b) // 报错
let b = 2
//函数的命名提升则意味着可以在同级作用域或者子级作用域里,在函数定义之前进行调用。
fn() // 2
function fn() {
return 2
}
两种方式对于调用函数方式以及返回结果而言是没有区别的,但根据命名提升的规则,我们可以得知方式 1 创建了一个匿名函数,让变量 f 指向它,这里会发生变量的命名提升;如果我们在定义函数之前调用会报错,而方式 2 则不会。
// 方式1
var f = function() {...}
// 方式2
function f() {...}
(注:笔记来自 朱德龙 前端高手进阶)
网友评论