我可以在同一个函数中使用函数作为对象

时间:2013-07-31 10:19:50

标签: javascript

我按如下方式编写代码,

function Myfunction(){
 Myfunction.myvar = "somevar";
}

执行该功能后,我可以访问Myfunction.myvar

它是如何工作的?如果我这样做,隐藏在这里的问题是什么?

如果有任何问题,请解释其背景。

4 个答案:

答案 0 :(得分:6)

由于函数在调用之前不会执行,因此不会立即评估Myfunction.myvar

调用它后,函数定义已安装为Myfunction,以便在调用它时可以解析它。

以下内容不起作用:

var x = {
       foo: 1,
       bar: x.foo } // x does not exist yet.

答案 1 :(得分:5)

  

它是如何运作的?

在某些执行上下文中声明函数时,会将绑定添加到该上下文的变量环境中。引用标识符时,将检查当前变量环境以查看该标识符是否存在绑定。

如果不存在绑定,则检查外部变量环境,依此类推,备份到全局范围。

所以:

// OUTER SCOPE
// Binding exists for 'example'
function example() {
    // INNER SCOPE
    // No binding for 'example'

    // References 'example' in outer scope
    example.x = 1;
}
  

隐藏在这个中的问题是什么?

没有(通常......虽然它是否适合你,取决于你想要做什么)。

您正在有效地创建该函数的“静态”属性。由于JavaScript函数是一流的,因此您可以像对待任何其他对象一样设置它们的属性。


请注意,如果您有一个命名函数 expression 而不是函数声明,则行为会有所不同:

var x = function example () {
    // Identifier 'example' is only in scope in here
};

答案 2 :(得分:2)

由于范围界定,您可能会遇到一个问题,因为更复杂的示例显示:

function Other() {
    console.log("a) Other.Myvalue",Other.Myvalue);
    Other.Myvalue=typeof Other.Myvalue==='undefined' ? 0 : Other.Myvalue+1;
    console.log("b) Other.Myvalue",Other.Myvalue);
}
Other();
Other();

这将导致

a) Other.Myvalue undefined
b) Other.Myvalue 0
a) Other.Myvalue 0
b) Other.Myvalue 1 

所以你真的将你的变量Myvar绑定到函数对象本身,它是一个单例并且只存在一次(并且由当前上下文中的函数定义本身创建,可能是全局上下文),而不是一个实例。宾语。但是如果你只是使用静态值并且不需要任何逻辑,那就像文字形式一样,我不会指望任何问题,其他文字形式更方便:

var Other = {
  Myvalue: "somevalue"
};

答案 3 :(得分:0)

在javascript中,每个函数都是一个对象。所以你可以添加任何自定义字段。

function A() {}

A.somevar = 'this is custom field';

A.prototype.somevar2 = 'this is field in A proto';

因此,当您使用A构造函数创建新对象时,它将从原型中获取属性。

var b = new A();
alert(b.somevar2);