我按如下方式编写代码,
function Myfunction(){
Myfunction.myvar = "somevar";
}
执行该功能后,我可以访问Myfunction.myvar
它是如何工作的?如果我这样做,隐藏在这里的问题是什么?
如果有任何问题,请解释其背景。
答案 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);