确定函数已定义为表达式或声明为函数

时间:2015-08-05 13:32:38

标签: javascript

我想知道函数是如何初始化的,使用表达式或声明为函数。 _亚马逊采访问题

expression : var a = function (){ }
declaration: function a (){ }

3 个答案:

答案 0 :(得分:0)

您可以执行a.toString()并解析名称。或者使用正则表达式

a.toString().test(/^\s*function\s*\(/);
function a(){ };  // gives false
var a = function (){ };   // gives true

当然,正如Grundy指出的那样,命名函数失败了。像

这样的东西
var a = function b() {};

function b() {};
var a = b;

ES6有.name(请参阅底部的浏览器表了解当前的事态) - https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Function/name

答案 1 :(得分:0)

我认为不可能这样做。唯一的区别是:

var func = function(){ };

function func() { };

是第一个在运行时分配的吗?我看到它的方式是两个函数语句都返回对它们各自的函数对象的引用。从这个意义上讲,它们都是一样的。你唯一可以争辩的是,一个没有命名而另一个没有,但你也可以为一个变量分配一个命名函数。

然而,他们的分配方式似乎有所不同。第二个似乎被分配给一个名为after的变量,就在执行上下文的开头。第一个必须等​​待执行上下文中的显式赋值。

因此,您可以在分配时进行测试。您可能认为可以在全局对象中执行此操作,例如:



//some protected vars that can't work without same-origin
var protected = ['caches', 'localStorage', 'sessionStorage', 'frameElement'];
var definedAtInit = [];
    for(prop in window){
        if(!isSandboxed(prop) && typeof window[prop] === 'function'){
           definedAtInit.push(prop);
        }
    };

    function isSandboxed(prop){
      return protected.indexOf(prop) !== -1;
    }

    function isItDefinedAtInit(funcName){
       return definedAtInit.indexOf(funcName) !== -1;
    }

    var func = function() {
       console.log('test');
    }

    var results = { isItDefinedAtInit : isItDefinedAtInit('isItDefinedAtInit'),
                   func : isItDefinedAtInit('func')
                   };

    document.getElementById('results').innerHTML = JSON.stringify(results, '/t');

<pre id="results"></pre>
&#13;
&#13;
&#13;

但是,您仍然可以执行以下操作:

var isItDefinedAtInit = function() { };
//After this, isItDefinedAtInit('isItDefinedAtInit') would be wrong.

你仍然遇到其他执行上下文的问题,我不认为在函数执行上下文中声明的函数会附加到任何对象。

我认为这样的检查是不诚实的。

答案 2 :(得分:0)

只有方法,我们可以确定函数已经定义了函数声明而不是表达式。

正如Grundy所提到的name属性相应的函数给出了需要信息,如果已经使用表达式name属性保存undefined值,则它保存函数名。

以下是代码:

var isDefinedAsFunction = function(fn){
    return fn.name !== undefined
}