this关键字&ES6

39 阅读4分钟

this关键字:

是js中的关键字,在不同的作用域中,代表的含义是不同的

一、具体含义:

1、全局:window

2、普通函数:window

function fn() {
    console.log(this);
}
console.log(this);
window.fn() // window

3、定时器函数:window

// 定时器函数中的this
window.setTimeout(function() {
    console.log(this);
})
console.log(this);                    
window.fn() // window

4、自调用函数:window


 (function() {
        console.log(this);
    })() //winodw

5、对象方法: 对象

6、时间函数:标签

7、箭头函数:上级作用域中this

二、改变:

1、call方法:

函数.call(新的this含义, 给函数传实参)

函数.call() - 就可以调用函数了

函数.call(参数1) - 就可以调用函数了,并且函数中的this就变成了参数1

函数.call(参数1, 参数2, 参数3, ...) - 就从参数2开始是在给函数传递实参

function fn() {
    console.log(this)
}

fn() // window
fn.call(document) // document

2、apply方法:

函数.apply(新的this含义, [给函数传实参])

apply和call的作用是相同的,唯一不同的地方,在于传递实参。

call在调用函数时,给函数传递实参,是从call的第二个参数开始传递;apply给函数传递实参,是将所有实参组成一个数组作为apply的第二个参数传递的:

function fn(a, b) {
    var c = a + b
    console.log(c)
    console.log(this)
}

fn(1, 2) // 3 window
fn.apply(document, [2, 3]) // document 5

3、bind方法:

bind方法有两个作用:复制函数,并改变新函数中的this。
复制函数:

语法:函数.bind() // 返回新函数

function fn() {
    console.log(this)
}

var newFn = fn.bind()
console.log(newFn)
console.log(fn)
console.log(newFn === fn) // false
改变新函数的this:

语法:函数.bind(新的this含义) // 返回的新函数中,this的含义会变成新的含义

function fn() {
    console.log(this)
}

var newFn = fn.bind(document)
fn() // window
newFn() // document

ES6:

一、定义变量的关键字:

1、let关键字:

特点:

  1. 不允许重复声明

  2. 不存在预解析

  3. 在大括号中声明的变量只能在大括号中使用,如if、for的大括号中声明的变量

2、const关键字:

const关键字也是用来定义变量的,具备let的所有特性,

另外,1、const定义的变量的值不能修改。

2、定义必须赋值

3、let、const和var的区别:

1、不能预解析

2、不能重复定义

3、自带块级作用域

二、模板字符串:

使用反引号定义字符串  `  `

1、可以多行定义一个字符串,并在控制台中以多行形式输出

2、模板字符串中可以识别变量,使用美元符大括号:${变量}

二、对象简写:

1、当对象的键和值所使用的变量名同名,就可以简写

var name = '张三'  
var age = 12  
  
//简写:
var obj = {  
name,  
age  
}  
  
//等同于  
var obj = {  
name: name,  
age: age  
}

2、当对象的键对应的值是匿名函数,就可以简写:

var obj = {  
eat() {}  
}  
等同于  
var obj = {  
eat: function() {}  
}

三、箭头函数: () => {}

对匿名函数简写

let fn = function(){
    console.log(111);
}
//使用箭头函数简写
let fn = ()=>{console.log(111);}

1、当只有一个形参的时候,可以省略小括号:

let fn = function(a){
    console.log(a);
}
//使用箭头函数简写
let fn = a = > {console.log(a);}

2、大括号中只有一行代码的时候,可以省略大括号,如果这行代码中有return,必须省略return

let fn = function(a){
    return a + 1;
}
//使用箭头函数简写
let fn = a = > a+1;

四、解构赋值:

快速的批量的定义变量,并拥有对象或数组中的值

1、var {键1, 键2} = 对象

定义了两个变量,变量名分别是键1,键2,值是对象中这两个键对应的值

2、var {键1: 新的变量名} = 对象

定义了一个变量,变量名是新的变量名,值是键1在对象中对应的值

3、var {键1: {键2}} = 对象

定义了变量,变量名是键2,值是对象.键1中 键2对应的值

4、var [变量名] = 数组

定义变量,值是数组的第一个元素

5、var [[变量名]] = 数组

定义变量,值是数组中第一个数组中的第一个值

五、展开合并运算符

语法:...数组名

1、当他作为实参的时候,是将一个数组,展开成多个值

2、将一个对象展开成多个键值对

3、当他当做形参的时候,是将多个实参收集成一个数组