首页 新闻 会员 周边 捐助

Javascript代码的小小疑问(34)

0
[已解决问题] 解决于 2015-07-01 14:59

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

 

为什么?

Coca-code的主页 Coca-code | 初学一级 | 园豆:10
提问于:2015-07-01 14:30
< >
分享
最佳答案
0

执行报错是理所当然的

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));
奖励园豆:5
visonme | 小虾三级 |园豆:1674 | 2015-07-01 14:44

    虽然你的代码通过了,但是关于“全局”,我理解是:我把Function给"污染"了,但定义的getName()是全局,也就是说可以访问到的。我目的是要一个,就是用getName();函数可以获取他的函数名。

    比如:

     var a = one() {

    //to do

  };

     var b = two() {

    //to do 

};

alert(getName(a));  //"one"

alert(getName(b));  //"two"

 

Coca-code | 园豆:10 (初学一级) | 2015-07-01 14:58

@殷敏峰: 

你的想法没有错,全局要竟然避免被污染,所以像你说的,如果你只是想后去函数名,那么我建议你去给Object对象添加getName这样的函数例如:

Object.prototype.get_name = function()
{
    console.log('get_name');
}

var fn = function show(){

};

fn.get_name();

或者在调用的时候通过Function构造函数来处理你的函数调用

 

当然可能还有别的一些方法也是可以实现的,这里只从你的例子出发我觉的通过Object原型添加函数会好点 

 

visonme | 园豆:1674 (小虾三级) | 2015-07-01 16:07

@visonme: 

可以给个诸如base.js的javascript的扩展吗?我觉得例如:getName();之类很通用,很有用,适量地“污染”,在这方面肯定有牛人的补充。。。

Coca-code | 园豆:10 (初学一级) | 2015-07-01 16:57
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册