読者です 読者をやめる 読者になる 読者になる

JS.next

JavaScriptの最新実装情報を追うブログ

Function#nameについて

概要

ES2015からは名前の無い関数定義であっても、コンテキストによって関数のnameプロパティが定義されるようになった。


nameプロパティが定義される例

直接的な変数への代入

      f1 = function () {}
var   f2 = function () {}
let   f3 = () => {}
const f4 = () => {}

console.log( f1.name, f2.name, f3.name, f4.name )  
  // "f1"  "f2"  "f3"  "f4"

直接的なプロパティ定義

o = {
      m1: function () {},
  ['m2']: () => {},
     m3() {}
}

console.log( o.m1.name, o.m2.name, o.m3.name )  
  // "m1"  "m2"  "m3"


nameプロパティが定義されない例

間接的なケース

f5 = [function () {}][0]
f6 = (v => v)(function () {})
f7 = f6

console.log( f5.name, f6.name, f7.name )  
  // ""  ""  ""

名前付き

f8 = function fn() {}
console.log( f8.name )  
  // "fn"


その他

シンボルの名前を持つ関数や、ゲッター・セッター・バインドされた関数のnameプロパティにはそれと分かるプリフィックスが付く。

o = {
  m4: (function fn() {}).bind(),
  [Symbol.for('m5')]() {},
  get m6() {},
  set m7(v) {}
}

console.log( o.m4.name )  //  "bound fn"
console.log( o[Symbol.for('m5')].name )  // "[m5]"
console.log( Object.getOwnPropertyDescriptor(o, 'm6').get.name )  // "get m6"
console.log( Object.getOwnPropertyDescriptor(o, 'm7').set.name )  // "set m7"


実装されるバージョン

V8 5.1.39(デフォルト有効)