→
標準外であった ES2015 以前の実装では、configurable 属性も false であることに注意してください。
警告: Function.name を使用しているときに、JavaScript の圧縮(ミニファイ)や難読化のような変換を行う際には注意が必要です。これらのツールは JavaScript ビルド パイプラインの一部として、本番環境に設置する前にプログラムのサイズを縮小するためによく使用されます。それらの変換は、ビルド時に関数名を変更することがあります。
次のようなソースコードは、
function Foo() {}; let foo = new Foo(); if (foo.constructor.name === 'Foo') { console.log("'foo' は 'Foo' のインスタンスである"); } else { console.log('おおっと!'); }
このように圧縮されるかもしれません。
function a() {}; let b = new a(); if (b.constructor.name === 'Foo') { console.log("'foo' は 'Foo' のインスタンスである"); } else { console.log('おおっと!'); }
非圧縮版では、プログラムは真の方の分岐を実行し、「'foo' は 'Foo' のインスタンスである」と表示するのに対し、圧縮版は異なる振る舞いをし、偽の方の分岐を実行します。それゆえ、上述の例のように Function.name に依存するならば、ビルドパイプラインが関数名を変更しないようにするか、特定の関数名を想定しない構造にする必要があります。
name プロパティは関数文の名前を返します。
function doSomething() {} doSomething.name; // "doSomething"
構文 new Function(…) または単に Function(…) で関数を作成すると、Function オブジェクトが作成され、その名前は "anonymous" になります。
D=(new Function).name; //="anonymous"
function キーワードを使用して生成された関数式またはアロー関数は、名前が "" (空文字列) になっています。
D=(function() {}).name; //="" D=(() => {}).name; //=""
変数とメソッドは、構文上の位置から無名関数の名前を推論できます(ECMAScript 2015 から)。
let f = function() {}; D=f.name; //="f"
let object = { someMethod: function() {} }; D=object.someMethod.name; //="someMethod"
関数式 で名前を持つ関数を定義することができます。
let object = { someMethod: function object_someMethod() {} }; D=object.someMethod.name; //="object_someMethod" try{ object_someMethod }catch(e){ alert(e); } // エラー発生:「ReferenceError: object_someMethod is not defined」
name プロパティは読み取り専用であり、代入演算子で変更することはできません。
let object = { // 匿名 someMethod: function() {} }; object.someMethod.name = 'otherMethod'; D=object.someMethod.name; //=someMethod
変更したければ、Object.defineProperty() を使ってください。
¶省く