1,作用域和自由变量
作用域代表了一个变量的合法范围,一个变量的作用域是程序源代码中定义的这个变量的区域。
1,全局作用域
不在任何函数内声明的变量(函数内省略var的也算全局)称作全局变量
就是在最外层定义的变量就被称为全局变量,全局都可以使用,所以是全局作用域。
2,局部作用域
在函数内声明的变量具有函数作用域,属于局部变量,就是在函数内部定义的变量,
只在函数内部有用,所以是局部作用域。
3,ES6的定义的块级作用域
声明变量的方法 有var let const
var 声明的变量可以变量提升 变量提升是将变量的声明提升至当前作用域的最顶部,而变量的赋值不会提升
let/const声明的变量让当前代码块变成一个暂时性的死区
内部变量不能在外部使用 他们声明的变量不存在变量提升
区别: const声明的变量必须给默认值 const声明的是常量不能重新赋值
const声明的变量的值如果是引用数据类型 则数据内部的数据可以修改
4,自由变量
假如在全局中定义了变量a,在函数中使用了这个a,这个a就是自由变量,可以这样理解,凡是跨了自己的作用域的变量都叫自由变量。
2,闭包
闭包就是一个函数的参数是另一个函数,或者一个函数的返回值是另一个函数,就被称为闭包。详细内容看博主这篇文章哦。
3,改变this指向的方法
因为有函数嵌套函数,或者其他的复杂结构,所以就会造成this指向改变的问题。而要改变this指向有三种方法。
有三个方法能改变this指向,fn.bind()、 fn.call() 、fn.apply()
他们都是改变this指向的方法 第一个参数都是this的指向
区别:
bind返回一个函数
call的参数是以散落的形式传递给函数
apply是以数组的形式传递参数
bind有返回值 返回值是调用bind方法的函数本身
call 没有返回值 他的第一个参数是要this的指向。第一个参数是谁,函数内部的this就指向谁其他参数以散落的形式传递给函数作为实参
apply 没有返回值 他的第一个参数是要this的指向。第一个参数是谁,函数内部的this就指向谁其他参数以数组的形式传递给函数作为实参
4,原型和原型链
1,原型的概念
JavaScript 的所有对象中都包含了一个 [proto] 内部属性,这个属性所对应的就是自身的原型
JavaScript 的函数对象,除了原型 [proto] 之外,还有 prototype 属性,
当函数对象作为构造函数创建实例时,该 prototype 属性值将被作为实例对象的原型 [proto]
2,prototype ,constructor,_ _proto_ _三者之间的区别是什么关系
构造函数的prototype指向原型对象
实例对象的_ _proto_ _指向构造函数的prototype所指向原型对象
原型对象的constructor指向构造函数
3,原型链的概念
对象访问属性和方法时,首先会在当前对象中寻找,找不到就去对象的原型中寻找,找到就使用,
找不到就去原型的原型中寻找,直到找到或undefined为止,就形成了原型链
最顶层的原型对象, 这个对象就是Object.prototype,
这个对象中保存了最常用的方法,如 toString、valueOf。这样我们才能在对象中使用这些方法