Page 244 - 你不知道的JavaScript(下卷)
P. 244
如果函数设定了 name 值,那么这个值通常也就是开发者工具中栈踪迹使用的
名称。
推导
对于没有词法名称的函数,name 属性是怎样的呢?
在 ES6 中,现在已经有了一组推导规则可以合理地为函数的 name 属性赋值,即使这个函
数并没有词法名称可用。
考虑:
var abc = function() {
// ..
};
abc.name; // "abc"
如果给了这个函数一个词法名称,比如 abc = function def() { .. },那么 name 属性当
然就是 "def"。而如果没有词法名称的话,直觉上看似乎名称为 "abc" 比较合理。
下面是 ES6 中名称推导(或者没有名称)的其他几种形式:
(function(){ .. }); // name:
(function*(){ .. }); // name:
window.foo = function(){ .. }; // name:
class Awesome {
constructor() { .. } // name: Awesome
funny() { .. } // name: funny
}
var c = class Awesome { .. }; // name: Awesome
var o = {
foo() { .. }, // name: foo
*bar() { .. }, // name: bar
baz: () => { .. }, // name: baz
bam: function(){ .. }, // name: bam
get qux() { .. }, // name: get qux
set fuz() { .. }, // name: set fuz
["b" + "iz"]:
function(){ .. }, // name: biz
[Symbol( "buz" )]:
function(){ .. } // name: [buz]
};
var x = o.foo.bind( o ); // name: bound foo
(function(){ .. }).bind( o ); // name: bound
元编程 | 221
图灵社区会员 avilang(1985945885@qq.com) 专享 尊重版权