Function.prototype.getName =function() {
if("name" in this)return this.name;
return this.name = this.toString().match(/function\s*([^()]*)\(/)[1];
};
var a = function fn(x) {
return x*x
};
alert(getName(a)); //getName is not defined
为什么?
执行报错是理所当然的
1. getName是定义在Function的原型链上的
2. getname的调用时在全局下的,解析时候自然在全局下查找,查找不到自然报getName is not define
例如: 这是类似你那个例子的情况下调用get_name
'use strict' Function.prototype.get_name = function(){ console.log('function: get_name'); } var fn = function show(name) { console.log('show:' + name ); }; var f = new Function(); f.get_name();
如果你要你的getName不出现那个错误那么你需要定义在全局下,例如
'use strict' function getName(){ // to do } var a = function fn(x) { return x*x }; alert(getName(a));
虽然你的代码通过了,但是关于“全局”,我理解是:我把Function给"污染"了,但定义的getName()是全局,也就是说可以访问到的。我目的是要一个,就是用getName();函数可以获取他的函数名。
比如:
var a = one() {
//to do
};
var b = two() {
//to do
};
alert(getName(a)); //"one"
alert(getName(b)); //"two"
@殷敏峰:
你的想法没有错,全局要竟然避免被污染,所以像你说的,如果你只是想后去函数名,那么我建议你去给Object对象添加getName这样的函数例如:
Object.prototype.get_name = function() { console.log('get_name'); } var fn = function show(){ }; fn.get_name();
或者在调用的时候通过Function构造函数来处理你的函数调用
当然可能还有别的一些方法也是可以实现的,这里只从你的例子出发我觉的通过Object原型添加函数会好点
@visonme:
可以给个诸如base.js的javascript的扩展吗?我觉得例如:getName();之类很通用,很有用,适量地“污染”,在这方面肯定有牛人的补充。。。