1

我希望能够将属性分配给函数本身内部的函数。我不想将它分配给调用对象。所以我想要这样做的等价物:

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

4 回答 4

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'
于 2012-08-29T18:40:22.967 回答
1
var testAgain = function() {
    arguments.callee.a = "this property won't be assigned to the function";
    return true;  
};

testAgain();
alert(testAgain.a);​
于 2012-08-29T18:41:25.320 回答
0

您可以通过简单地使用名称来分配属性,如下所示:

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

test被调用时,该属性将被设置。

演示

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

于 2012-08-29T18:42:00.940 回答
0
var test = function() {
    test.a = 'a';
};

或者您可以使用原型,在此处阅读更多内容。

于 2012-08-29T20:54:22.730 回答