为什么这样起作用:
var a = () => {
var print = function(i) { console.log(i); return this; }
var print2 = function(i) { console.log(i); return this; }
return { print:print , print2:print2 }
}
a().print(5).print2(5);
这也有效:
var b = () => {
var print = (i) => { console.log(i); return this; }
return { print:print}
}
b().print('Arrow function works');
这不起作用:
var b = () => {
var print = (i) => { console.log(i); return this; }
var print2 = function(i) { console.log(i); return this; }
return { print:print , print2:print2 }
}
b().print(5).print2(5);
在非箭头函数中,this
的值取决于函数的调用方式。如果该函数被称为对象的成员,则this
引用此对象:
someObj.myFunction() // inside myFunction this will point to someObj
相反,箭头功能不影响this
。因此,在箭头函数中,this
的值与封闭范围中的值相同。
全部归因于箭头功能的行为(docs)
逐步说明:
var b = () => {
// 1
var print = (i) => { console.log(i); return this; }
var print2 = function(i) { console.log(i); return this; }
return { print:print , print2:print2 }
}
const res = b()
// 2
const secondRes = res.print(5)
// 3
secondRes.print2(5);
print
函数从外部范围保存了this
引用,因此无法再对其进行分配print
函数未使用来自this
变量的res
引用,因为this
已附加到上述print
函数上]secondRes
不会引用b
函数返回的对象。但是它将使用打印功能附带的this
参考。最后,因为secondRes
没有print2
属性-它抛出希望对您有帮助<3
Lex82的答案给出了原因。我想返回函数,因此可以使用函数链接:
var b = () => {
var print = (i) => { console.log(i); return { print:print , print2:print2 }; }
var print2 = function(i) { console.log(i); return this; }
return { print:print , print2:print2 }
}
b().print(5).print2(5);
因为不能同时使用箭头功能和常规功能
将您的代码更改为此代码:
var b = () => {
var print = (i) => { console.log(i); return this; }
var print2 = (i) => { console.log(i); return this; }
return { print:print , print2:print2 }
}
b().print(5).print2(5);