查明函数是匿名的还是在对象中定义的

fre*_*rik 6 javascript function

我正在尝试用 JavaScript 编写一个辅助方法。如果发送函数或对函数的引用,它的行为应该有所不同。

我想像这样使用它:

helper('div', function () { return false; })
helper('div', obj.fn)
Run Code Online (Sandbox Code Playgroud)

我不明白的是:如何在辅助函数内部区分两者之间的区别?

我认为这是因为 JavaScript 在发送 obj.fn 之前首先评估它。我发现的唯一解决方法是将 obj.fn 作为 obj 发送,即

helper('div', { fn: obj.fn })
Run Code Online (Sandbox Code Playgroud)

然后我可以用 typeof 来区分两者之间的区别。但我真的很喜欢某种无需额外对象声明的方法。

And*_*y E 0

您可以使用它toString()来查明函数是否是匿名的,假设它被声明为命名函数而不是分配给变量的未命名函数:

function jim () { var h = "hello"; }
function jeff(func) 
{ 
    var fName;
    var inFunc = func.toString();
    var rExp   = /^function ([^\s]+) \(\)/;
    if (fName = inFunc.match(rExp))
       fName = fName[1];

    alert(fName);
}
Run Code Online (Sandbox Code Playgroud)

如果有的话,会给你函数的名称。

jeff(function () { blah(); }); // alert: null;
jeff(function joe () { blah(); }); // alert: "joe";
jeff(jack); // "jack" if jack is function jack () { }, null if jack = function() {} 
Run Code Online (Sandbox Code Playgroud)

我之前的编辑提到了其他浏览器中不存在的 IE 怪癖,并且从版本 9 开始在 IE 中不再有效。但是,您仍然可以使用命名函数表达式将命名函数分配为对象属性:

var obj = {
    fn: function namedFunction () { }
};
Run Code Online (Sandbox Code Playgroud)

这适用于所有浏览器,但 IE 8 及更低版本不遵守该规范,该规范规定该函数只能在其自己的块内通过该名称使用。