函数
所有的函数都会暴露出一个只读的name属性,含有函数的相关信息,保存的是一个函数的标识符。在声明一个没有名称的函数时,函数的标识符就是一个空的字符串。
如果使用Function构造函数来创建一个函数的时候,那么函数的标识符为“anonymous”。
如果函数是获取函数、设置函数、或者是bind()实例化,那么标识符就会添加一个前缀bound foo
箭头函数
箭头函数没有单独的this、arguments、super,并且不能作为构造函数。
虽然箭头函数没有创建自己的this,但是它会在自己的作用域链上继承this,不能修改this的指向,所以在call和apply调用时,只能传参数,不能绑定this。
function Duxin(){
this.name='duxin';
setInterval(()=>{
console.log(this.name)
},1000)
}
箭头函数没有prototype属性
箭头函数不能作为函数生成器
普通函数
普通函数可以作为构造函数,this指针指向一个新的对象。
如果普通函数是一个对象的方法,那么this指向的是该对象。
区别:
箭头函数没有prototype(原型),所以箭头函数本身没有this
箭头函数的this在定义的时候继承自外层第一个普通函数的this
。
如果箭头函数外层没有普通函数,严格模式和非严格模式下它的this都会指向window(全局对象)
箭头函数本身的this指向不能改变,但可以修改它要继承的对象的this。
箭头函数的this指向全局,使用arguments会报未声明的错误
。
箭头函数的this指向普通函数时,它的argumens继承于该普通函数
使用new调用箭头函数会报错,因为箭头函数没有constructor
箭头函数不支持new.target
箭头函数不支持重命名函数参数,普通函数的函数参数支持重命名
箭头函数相对于普通函数语法更简洁优雅
参数
JavaScript函数的参数不关心参数的个数和参数的数据类型。比如定义函数时设置两个形参,调用函数的时候,不一定就是传递两个参数,解释器也不会报错。
原因是JavaScript函数的参数在内部定义为一个数组,JavaScript的数组的长度在安全数值范围内,没有限制。如果是用function关键字来定义函数的话。在函数内部可以访问arguments对象,获取到传递参数的个数了。【arguments对象是一个类数组对象】