函数引用其属性是合法的javascript(ECMAScript-5)吗?
var baz = function(callback) {
return callback();
};
var foo = function() {
return foo.bar;
}
foo.bar = 1;
foo(); // 1?
baz(foo); // 1?
编辑:你能否引用我的ECMA规范声明这是合法的部分?
答案 0 :(得分:2)
是的,函数是一个对象,对象具有属性,并且它们可以访问它们的属性。
请记住,在JS函数中是一等公民,他们可以拥有自己的属性。还要记住,当调用函数时,属性评估会发生,而不是在创建它时,属性可以在以后添加。
你可以在这里看到:
var foo = function() {
return foo.bar;
}
foo.bar = 1;
alert(foo()); // 1?

答案 1 :(得分:2)
是
当使用对象时,人们经常会遇到这样的问题,这些对象在初始化期间进行评估,并且在尝试引用其属性时不存在。这不是函数的问题,因为在稍后调用函数之前不会访问该属性。
例如:
let foo = {
bar: 1,
baz: foo.bar + 1
};
失败,因为尚未将对象分配给foo
,因此foo.bar
未定义。
对于函数,这不是问题,因为foo
是对函数的引用,并且在函数调用之前不会访问bar
:
function foo() {
return foo.bar + 1;
}
foo.bar = 1;
答案 2 :(得分:1)
您可以使用更好的模式,如下所示:
var baz = function() {
var myVal = 0;
return function() {
//body
}
}()
这样你在闭包内有一种备忘录变量可以为你保留值
答案 3 :(得分:0)
函数是对象,所以当然,它们可以拥有属性并访问它们。请注意,函数体对这些属性没有神奇的访问权限。
请注意,这样的代码要求函数体知道其名称:
function foo() {
return foo.bar;
}
..但您可以利用arguments
属性删除冗余/依赖项:
function foo() {
return arguments.callee.bar;
}
foo.bar = 1;
foo(); // 1