技術上 - 沒關係。
var myFunction = function() { } //anonymous
和
var myFunction = function myFunction() { } //named
將在所有方面,但一個相同的 - 使用調試工具,看着堆棧跟蹤會顯示不同的標識符。第一個版本將顯示爲(anonymous function)
,而後者則顯示出了它的名字 - myFunction
。所以,命名函數純粹是爲了開發人員的方便和開發。
值得關注的是函數的名稱並不需要是相同的對它的引用,例如,你可以有
var myFunction = function someOtherName() { /* ... */ }
,然後這將顯示在開發工具someOtherName
。但是,您將而不是能夠通過做someOtherName()
來調用它 - 名稱和對該函數的引用是不同的事情。爲了簡單起見,它們通常被設置爲相同的標識符。現在
,到你的例子 - 有是給你貼什麼
function myFunc() {
this.myMethod =() => {
//..
}
}
這並不等同於一個名爲功能的差異。這是使用ES6箭頭功能 - 正常情況下,它們將被命名爲相同的變量,他們被分配到:
var arrowFunction =() => {};
var obj = {
arrowMethod:() => {}
}
console.log("function name is: " + arrowFunction.name);
console.log("object property function name is: "+ obj.arrowMethod.name);
(注意,這個工作在Chrome,但不能在Firefox的一些原因 - .name
屬性應該設置)
除了命名差異之外,箭頭函數與「簡單」函數還有其他差異。最值得注意的是,他們的語境是詞彙綁定的。以下是這在實踐中意味着
function arrowExample() {
this.data = "Hello arrow";
this.myMethod =() => {
return this.data;
}
}
function normalFunctionExample() {
this.data = "Hello normal function";
this.myMethod = function myMethod() {
return this.data;
}
}
var arrowInstance = new arrowExample();
var normalFunctionExampleInstance = new normalFunctionExample();
console.log("Invoking arrow with context: " + arrowInstance.myMethod());
console.log("Invoking normal function with context: " + normalFunctionExampleInstance.myMethod());
var arrowReference = arrowInstance.myMethod;
var normalFunctionReference = normalFunctionExampleInstance.myMethod;
console.log("Invoking arrow without context: " + arrowReference());
console.log("Invoking normal function without context: " + normalFunctionReference());
雙方你'myMethod'功能是匿名的表情? – Bergi
^正確,正如MDN所說的使用箭頭語法可以讓您免於將此引用到另一個變量以便稍後使用它的麻煩。 非箭頭函數來自ES5語法,所以如果你使用的是ES6,總是使用箭頭函數,它不會破壞任何東西,但它會幫助你引用'this'。 – Diabolic
@Diabolic _「如果你使用的是ES6,總是使用箭頭函數,它不會破壞任何東西」_這是不正確的。如果使用定義的'this'值調用回調函數,則箭頭函數將具有「this」的「錯誤」值。 – zeroflagL