this调用的几种类型:
1.普通调用(函数名())===指向window
funtion fn(){
function fn(){
console.log('我是fn函数:',this);
function a(){
console.log('我是a函数:',this);
}
a()
}
// 进行调用
fn()
}
如上所示:该函数进行调用时,指向window
2.对象调用方式(对象名.函数名())====点前面是谁this就指向谁
var obj = {
a:function(){
console.log(this);
}
}
div.onclick = function(){
obj.a()
}
该this指向源对象obj
3.定时器调用:通过定时器调用的函数都指向window
4.事件处理函数:this指向事件源(绑定该事件的元素)
强制改变this指向
1)call
语法:函数名.call()
参数:call里边第一个参数是this的指向,从第二个开始往后的就是形参赋值
特点:改完立即调用
fn.call(obj, 10, 20, 30, 40)
fn()
2)apply
语法:函数名.apply()
参数:第一个参数是this指向,第二个参数是一个数组或者伪数组,数组中的每一项是形参赋值。
特点:改完立即调用
fn.apply(obj, [10, 20, 30, 40])
fn()
3)bind
语法:函数名.bind()
参数:第一个是this指向,第二个参数爱是一次是依次形参赋值(传参和call一样)
特点:改完不会立即调用,而是返回一个新的函数,新的函数中就是改完this指向之后的
var res = fn.bind(obj, 10, 20, 30, 40)
res()
console.log('=========');
fn()
3.新增的变量let和const
在es6新语法中新增了2个定义变量的关键字
分别是let和const,let我们叫做变量 const我们叫做常量
let和const 与 var的区别:
1.从预解析角度分析
let和const没有预解析,所以要求变量必须先定义在使用,如果定义之前使用会报错
var会做预解析,所以定义之前用和定义之后用都不会报错
2.重复的变量名
let和const在定义的时候不允许出现重复的变量名,重名直接报错
但是var在定义的时候出现重复的变量名是不报错的
3.块级作用域
var定义的变量是没有块级作用域的,只有函数的{}才能显示var的使用范围
let和const定义的是有块级作用域的
什么叫块级作用域?任何一个可以执行代码的{}都叫做块级作用域,都可以限制变量的使用范围
let和const的区别
4.修改值的问题
let定义的量后期值是可以修改的
const定义的量后期值不允许修改
let一般叫做变量 const一般叫做常量
一般我们获取元素都是在一开始获取依次,后期就再也不获取,再也不更改了,所以一般获取元素可以使用const去定义
5.初始值的问题
let定义的可以不写初始值,因为后期再赋值也可以
const定义的必须写初始值(因为const后期无法再重新赋值,如果一开始就不写初始值,以后就都没有,所以规定必须写)
4.内存问题
基本数据类型是直接存储在栈空间中,复杂数据类型是名字存储在栈空间中,真实的数值存储在堆空间中,会把堆空间的地址给到变量。
在赋值时:
基本(简单)数据类型:是直接把数据复制一份给到另外一个人,2个人互不影响
复杂(引用)数据类型在赋值的时候不会把真实的数据给另一个人,而是会把存放这个数据的空间地址给另一个人
那么这样就会造成2个人共用同一个空间地址,一个人改变了空间里的东西,另外一个人一定会受到影响。
5.箭头函数
箭头函数是es6中推出的新的定义函数的方式
其实就是对声明式函数、赋值式函数(匿名函数)的简写形式
箭头的语法:()=>{ }
( )中是写形参的,=>就是箭头函数的标志,{ }就是函数中代码段的
特点:
1.省略function不写
2.还可以省略小括号()不写,形参只有1个的时候才可以省略
如果没有形参或者有1个以上的形参小括号()必须写
3.{ }也可以省略不写,前提:函数体内只有一句代码的时候
如果不写{ }会把这句话当作返回值。
4.箭头函数中是没有arguments的
在普通函数中天生自带一个叫做arguments的东西,它里面存储了所有的实参
5.箭头函数中没有this
但是如果你在箭头函数中写了this,那么这个this到底指向谁呢。
箭头函数自己没有this,他会用他父亲函数的this
6.不能当作构造函数函数