2019-01-11

2019-01-11  本文已影响0人  kathyever

ES6 箭头函数

const Person = {
    'name':'little bear',
    'age':18;
    'sayHello':function(){
        setInterval(function(){
            console.log('我叫' + this.name + '我今年' + this.age + '岁')
        },1000)
    }
}
Person.sayHello()
//输出的结果:我叫undefined,今年我undefined岁。

//因为setInterval执行的时候,是在全局作用域下的
//所有this指向的是全局window,而window上没有name和age,所以输出的就是undefined


const Person = {
    'name':'little bear',
    'age':18,
    'sayHello':function(){
        let self=this
            setInterval(function(){
                console.log('我叫' + self.name + '我今年' + self.age + '岁!')
            },1000)
    }
}
const sayHelloFun = Person.sayHello
sayHelloFun()

箭头函数表示法:()=>console.log('Hello')

箭头函数和普通函数的区别

和普通函数相比,箭头函数主要就是下面两个方面的特点:
1、不绑定this,arguments
2、更简化的代码语法

◆ 不绑定this

const Person ={
    'name':'little bear',
    'age':18,
    'sayHello':()=>{
        setInterval(()=>{
            console.log('我叫'+this.name+'我今年'+this.age+'岁!')
        },1000)
    }
}
Person.sayHello()
//输出的结果还是undefined,为什么呢?
//因为把方法写在对象里,而对象的括号是不能封闭作用域的。此时的this还是指向全局对象
`最好不要用箭头作为对象的方法!`

function Person(){
    this.name='little bear',
    this.age=18
    setInterval(()=>{
        console.log('我叫'+this.name+'我今年'+this.age+'岁!')
    },1000)
}
let p=new Person()
//箭头函数使用了定义时上下文的this,且与哪里调用没有关系。

◆ 不绑定arguments
箭头函数还有一个比较有特点的地方就是其不绑定arguments。如果在箭头函数中使用arguments参数不能得到想要的内容。

let arrowfuc=>()=>console.log(arguments.length)
arrowfunc()//arguments is not defined

ES6声明变量的6中方法

ES5只有两种声明变量的方法:var命令和function命令
ES6除了添加left和const命令,还有另外两种声明变量的 方法:important命令和class命令。

顶层对象的属性

顶层对象,在浏览器环境指的事window对象,在Node值的是global对象。
ES5之中,顶层对象的属性与全局变量是等价的。

window.a=1;
a//1

a=2;
window.a//2

顶层对象的属性赋值与全局变量的赋值是同一件事。

顶层对象的属性与全局变量挂钩被认为是Javascript语言最大的败笔之一:
1、无法在编译时就报出变量未声明的错误,只有运行时才能知道(因为全局变量可能顶层对象的属性创造的,而属性的创造是动态的。)
2、很容易不知不觉的就创建了全局变量
3、顶层对象的属性是到处可以读写的,这非常不利于模块化编程。
window对象有实体含义,指的是浏览器的窗口对象,顶层对象是一个有实体含义的对象,也是不合适的。

ES6为了改变这一点,做了些改变:
1、为了保持兼容性,var命令和function命令声明的全局变量,依旧是顶层对象的属性
2、let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性
也就是说,从ES6开始,全局变量将逐步与顶层对象的属性脱钩。

var a=1;
//如果再Node的REPL环境,可以写成global.a
//或者采用通用方法,写成this.a
window.a//1

let b=1;
window.b//undefined

上面代码中,全局变量a由var命令声明,所以它是顶层对象的属性
全局变量b由let命令声明,所以它不是顶层对象的属性,返回undefined

global对象

ES5的顶层对象,本身也是一个问题,因为它在各种实现里面是不统一的。
◆ 浏览器里面,顶层对象是window,但Node和Web Worker没有window。
◆ 浏览器和Web Worker里面,self也指向顶层对象,但是Node没有self。
◆ Node里面,顶层对象是global,但其他环境都不支持。

上一篇下一篇

猜你喜欢

热点阅读