普通函数和箭头函数的区别
- 箭头函数不能作构造函数。
- 箭头函数没有argument参数。如果你想访问箭头函数的直接参数,可以使用剩余参数 ...args,剩余参数 ... args 接受箭头函数的执行参数
- 箭头函数没有自己的This.指向,箭头函数内部的 this 值始终等于外部函数的 this值。换句话说,箭头函数可按词法解析 this,箭头函数没有定义自己的执行上下文。
- 常规函数如果缺少 return 语句,或者 return 语句后面没有表达式,则常规函数隐式返回undefined
如果箭头函数包含一个表达式,而你省略了该函数的花括号,则将显式返回该表达式。这些是内联箭头函数
This指向问题
-
this是声明函数时附加的参数,指向特定的对象,也就是隐藏参数。
-
this提供了一种更加优雅的方式来隐式的传递对象引用。
-
this永远指向调用他的对象
一个测试题
var length = 10;
function fn() {
console.log(this.length);
}
var obj = {
length: 5,
method: function(fn) {
fn();
arguments[0]();
}
};
obj.method(fn, 1);//输出是什么?
只要认准 this永远指向调用他的对象,这道题就很简单了
在执行 obj.method()
时,如果函数内部执行console.log(this.length)
,函数的调用对象为obj
,this
指向obj
,但是method()
内部执行的是fn()
函数,而fn()
函数的调用对象为window
,即window.fn()
,即this
指向window
,输出为 10;
参数fn
和1
属于arguments类数组对象,arguments[0]()
就是调用了fn()
,此时fn
的作用域为arguments
,即this
指向arguments
,this.length
即传入的参数的长度2
结果输出为 10,2
闭包和自执行参数
var test = function(a){
this.a = a;
return function(b){
return this.a + b;
}
}(function(a,b){
return a;
}(1,2))
test(4)
解析
var test = function(a){
this.a = a; // this指向window
return function(b){
return this.a + b;
}
}
var getA = function(a,b){
return a;
}(1,2) //自执行函数 返回1,b没有用到
即:
test(getA)(4) // test(1)(4)
test(1) 返回函数
function(b){
return this.a+b
}
此时 a 为 1
很明显 最后返回 1+4 结果为 5