do
能够造成闭包,使方法做用域不受外部变化的影响。arguments
数组访问传递给函数的全部对象(低可读性)@name
为this.name
的简写,this
表示上下文环境。相应的,有new
关键字,apply
和call
方法。node
new
关键字,会把函数做为构造函数建立一个新对象,上下位即为该新对象。call
或者apply
调用函数时,给定的第一个参数为上下文。obj.func
来调用时,该对象为上下文。因为上下文在调用时绑定,所以可能会出现预料以外的状况。将->
改成=>
,能够确保this
的意义与函数定义所在位置的this
同样。编程
属性参数能够缩短代码,如数组
setName = (name) -> @name = name
能够简写为闭包
setName = (@name) ->
使用表达式做默认参数,则表达式将在函数被调用的上下文中执行。app
函数调用能够写成do f
。例如do (x) -> ...
是((x) -> ...)(x)
的简写,这个例子是node.js循环中捕获变量的经常使用写法。函数
=>箭头函数表达式:this
this
在箭头函数出现以前,每一个新定义的函数都有它本身的 this
值(在构造函数的状况下是一个新对象,在严格模式的函数调用中为 undefined,若是该函数被做为“对象方法”调用则为基础对象等)。This
被证实是使人厌烦的面向对象风格的编程。spa
function Person() { // Person() 构造函数定义 `this`做为它本身的实例. this.age = 0; setInterval(function growUp() { // 在非严格模式, growUp()函数定义 `this`做为全局对象, // 与在 Person()构造函数中定义的 `this`并不相同. this.age++; }, 1000); } var p = new Person();
在ECMAScript 3/5中,经过将this
值分配给封闭的变量,能够解决this
问题。code
function Person() { var that = this; that.age = 0; setInterval(function growUp() { // 回调引用的是`that`变量, 其值是预期的对象. that.age++; }, 1000); }
或者,能够建立绑定函数,以便将预先分配的this
值传递到绑定的目标函数(上述示例中的growUp()
函数)。对象
箭头函数不会建立本身的this,它只会从本身的做用域链的上一层继承this
。所以,在下面的代码中,传递给setInterval
的函数内的this
与封闭函数中的this
值相同:
function Person(){ this.age = 0; setInterval(() => { this.age++; // |this| 正确地指向 p 实例 }, 1000); } var p = new Person();
鉴于 this
是词法层面上的,严格模式中与 this
相关的规则都将被忽略。
function Person() { this.age = 0; var closure = "123" setInterval(function growUp() { this.age++; console.log(this.age);//NAN }, 1000); } var p = new Person(); function PersonX() { 'use strict' this.age = 0; var closure = "123" setInterval(()=>{ this.age++;
console.log(this.age);//正常的计数
}, 1000); } var px = new PersonX();
严格模式的其余规则依然不变.