变量
var
-
作用域:var 声明范围是在函数作用域中
-
变量提升:程序执行是会进行预解析,var 定义的变量的声明在预解析时会被提升到当前作用域的最前面但不赋值。
-
可以重复使用var 可以定义名字一样的变量,以最后一个为准
var a=15;
var a=46;
-
如果定义变量时没有声明直接赋值
a=10;a变量会变成全局变量
let
-
作用域:在声明范围是在块级作用域
for(var i = 0; i<5;i++){ setTimeout(()=>console.log(i),0) // 5 5 5 5 5 }
for(let i = 0; i<5;i++){ setTimeout(()=>console.log(i),0)//0 1 2 3 4 }
每次循环都会创建一个新的块级域,所以使用let声明的变量不会被覆盖
const
和let基本相同,区别是使用const声明的变量必须初始值,而且不能重复声明,不能改变值。如果值是对象的引用,修改对象的内容是可以的。
数据类型
typeof 判断数据类型
undifind 声明的变量没有赋值,值默认是undifind
null 空指针对象,定义一个变量将来
javaString 高级
作用域
在E5中只有两种作用域,一个是对象的作用域,一个是函数的作用域
this
首先this是什么,this指向的是一个对象,指向的是什么对象只有在运行的时候才能知道,而且this指向的是一个对象,或者说是执行是的运行环境。
在对象中的this
var obj={
name:"小米"
eat:function(){
console.log("我的名字叫"+this.name)
}
}
obj.eat() // 我的名字叫小米
为什么会输出我的名字叫小米,刚才说过this 指向的是当前的运行环境,方法eat是在obj这个运行环境里面运行的,所以指向的obj
在函数中的this
call,apply,bind
改变this的指向,可以实现重继承
obj.eat.call(windows) ,将eat中的this指向了window
call和apply的区别是传参的不同,apply是使用数组传递参数的,bind是改变的this,但不会执行函数
这个函数在全局变量执行就指向windows
继承
对象的继承
使用prototype和constructor实现
构找函数的继承
call
闭包
一个函数有权访问另一个函数的变量,其实就是一个函数嵌套另一个函数,里面的那个函数叫做闭包函数。 使用闭包的好处是可以保护私有变量 坏处是容易内存溢出,因为内部函数如果没有执行完成,外部函数就不会被销毁
www.cnblogs.com/sandaizi/p/… 里面有闭包详细的解答,还有其中容易出现的坑点
作用域链
构造函数
promise
实例对象和函数对象的区别
new 出来的对象是实例对象,将一个函数作为对象使用时,他就是一个函数对象 xxx.call()
错误处理
error是所有错误的父 类型错误 引用错误 语法错误 栈错误
错误的处理
try{ 有可能出错的代码 }catch(error){}
trrow error 抛出之后在他的外层进行接收处理
js单线程
同步任务和异步任务
只能按顺序执行的是同步任务,可以先挂起,之后在执行的是异步任务 同步回调函数和异步回调函数
js 的执行过程
js代码是单线程的,代码只能从上往下执行。但实际当中浏览器是多个线程配合执行js代码,在执行代码时会把异步任务
什么是promise
promise是一个构造函数,一个容器,里面的操作会在未来的某个时间执行。
promises的英文意思是承诺。一个promise对象只有三种状态,进行中,成功,结束,状态一旦改变就不能修改了。
var pri = new promise(function(resolve,reject){
if(ture){
resolve("成功了")//不加return这个会是最后执行
console.log("11")//这个会比resolve先执行
}
else{
reject("失败了")
}
})
pri.then((value)=>{console.log(value)})
.catch(value=>{console.log(value))
resolve和reject是内置的一个api,pomise状态变成resolve就会触发then,变成reject就会触发catch,通常要加上return
then第一个参数是成功时执行的回调函数,第二个是失败时执行的回调函数
.catch是发生错误时错误会被捕获,包括then中发生的
他解决了回调地域的问题