访问函数内的函数属性

时间:2012-08-29 18:34:28

标签: javascript

我希望能够将属性分配给函数本身内的函数。我不想将它分配给调用对象。所以我想要相同的做法:

var test  = function() {                    
    return true;         
};

test.a = 'property on a function';
alert(test.a);

而不是这个,将属性分配给全局对象:

var testAgain = function() {
   this.a = "this property won't be assigned to the function";

   return true;  
};

testAgain();
alert(window.a);

编辑:澄清一下,我想知道是否有这样的事情:

var test = function() {
   function.a = 'property on a function';
};
alert(test.a); // returns 'property on a function'

不知道该函数被称为测试或必须执行它。 我当然知道这不是有效的语法

4 个答案:

答案 0 :(得分:3)

  

[有没有办法在函数上设置属性]而不知道函数被调用test 或必须执行

强调我的。

您可以在函数上设置属性,而无需知道其全局变量名称必然是什么,但是必须以某种方式引用该函数。

我认为模块模式非常接近:

window.test = (function () {
    //the function could be named anything...
    function testFn() {
        ...code here...
    }
    //...so long as the same name is used here
    testFn.foo = 'bar';
    return testFn;
}());
window.test.foo; //'bar'

外部封闭会阻止testFn在全局范围内被访问,因此所有其他引用都必须使用window.test


这部分答案与问题的先前版本有关。

最简单的方法是使用命名函数:

var test = function testFn() {
    testFn.foo = 'bar';
    return true;
};

test.foo; //undefined
test();
test.foo; //'bar'

更好的方法是使用模块模式,这样就不会意外地产生全局泄漏问题:

var test = (function () {
    function ret() {
        ret.foo = 'bar';
        return true;
    }
    return ret;
}());

test.foo; //undefined
test();
test.foo; //'bar'

答案 1 :(得分:1)

var testAgain = function() {
    arguments.callee.a = "this property won't be assigned to the function";
    return true;  
};

testAgain();
alert(testAgain.a);​

答案 2 :(得分:0)

您可以通过简单地使用名称来指定属性,这样做:

var test = function () {
    test.a = 'a';
    return true;
};

调用test时,将设置属性。

Demo

可以使用arguments.callee,正如su-所说,但这被认为是非常糟糕的做法。此外,它不会在严格模式下工作。

答案 3 :(得分:0)

var test = function() {
    test.a = 'a';
};

或者你可以使用原型,阅读更多here