在函数声明和函数命名表达式中都有name属性。很多资料中都说明函数声明和命名函数表达式中都已定义了name属性,对此我也深信不疑。今天做了一个小测试,发现在IE下函数的name属性一直都是未定义。
1 function foo() {};//函数声明
2 var bar = function(){};//函数表达式
3 var baz = function baz(){};//命名表达式
4
5 //Firefox,WebKit
6 console.log(foo.name);//"foo"
7 console.log(bar.name);//""
8 console.log(baz.name);//"baz"
9
10 //IE
11 console.log(foo.name);//"undefined"
12 console.log(bar.name);//"undefined"
13 console.log(baz.name);//"undefined"
2 var bar = function(){};//函数表达式
3 var baz = function baz(){};//命名表达式
4
5 //Firefox,WebKit
6 console.log(foo.name);//"foo"
7 console.log(bar.name);//""
8 console.log(baz.name);//"baz"
9
10 //IE
11 console.log(foo.name);//"undefined"
12 console.log(bar.name);//"undefined"
13 console.log(baz.name);//"undefined"
在IE下获取函数名称可以使用toString()方法,然后使用正则表达式匹配:
1 /**扩充函数原型,获取函数名*/
2 Function.prototype.getSelfName = function() {
3 return typeof this.name === "string" ? this.name : /function\s+([^\{\(\s]+)/.test(this.toString()) ? RegExp['$1'] : '[Unknown]';
4};
2 Function.prototype.getSelfName = function() {
3 return typeof this.name === "string" ? this.name : /function\s+([^\{\(\s]+)/.test(this.toString()) ? RegExp['$1'] : '[Unknown]';
4};