将匿名函数分配给标识符时,为什么可以获得匿名函数的名称?

时间:2019-01-04 00:10:55

标签: javascript

我正在读《秘密JavaScript忍者》这本书。该书说,如果您为变量分配匿名函数,则如果引用name属性,它将不包含变量的名称,但是如果引用此属性,则会看到它。

这怎么可能?

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-plugin-plugin</artifactId>
    <version>3.6.0</version>
    <executions>
        <execution>
            <goals>
                <goal>descriptor</goal>
            </goals>
        </execution>
    </executions>
</plugin>

但是,如果我通过window对象的属性声明该函数,则该函数名会丢失

var canFly = function(){return true}
console.log(canFly.name)

为什么我从书中描述的第一句话不合适?

2 个答案:

答案 0 :(得分:4)

根据MDN page about Function.prototype.name

  

变量和方法可以从其语法位置推断出匿名函数的名称(ECMAScript 2015中的新增功能)。

似乎以obj.prop = ...形式的属性分配声明函数不符合自动函数名称的定义:

var foo = {};
foo.prop = function() { return true; };
console.log(foo.prop.name); // ""

您可能正在阅读“ JavaScript忍者的秘密”的第一版(从2008年开始)。该版本是关于一个旧的JavaScript版本的,该版本现在已经过时了。那时甚至对变量的分配也不会导致自动函数名称定义(至少没有指定)。我强烈建议您获得第二版(2016)的副本,其中还包括ES2015中引入的功能。

答案 1 :(得分:0)

它是因为您在技术上没有为函数分配名称。底部代码段中的操作是声明window.isDeadly并将其分配给匿名函数。有关如何实现您的尝试的信息,请参见下文。

<tr *ngFor="let invoice of invoices | filter : [
                                            {field:'number_invoice' , value:filterInvoice}, 
                                            {field:'note_invoice' , value:filterInvoice},
                                            {field:'customer_invoice' , value:filterInvoice},
                                            {field:'payment_invoice' , value:filterInvoice}
                                            ] 
         paginate: { itemsPerPage: 10, currentPage: page }, index as i">