我知道我会找那些说我不应该这样做的人,但我很好奇人们是如何做到的。
我知道我已经看到你可以在哪里输入一个属性的名称并获得一个值,但是然后你将括号添加到最后并访问一个方法。
在视觉上,我这样说:
foo returns 'bar'
foo() performs a function
问题是如何?
答案 0 :(得分:2)
由于如何在对象上解析属性,这是不可能的。这是唯一远近关闭的事情:
function f() {
return 'I am being returned from the function.';
}
f.toString = function () {
return 'I am a property on the variable.';
}
console.log('f() says: ' + f());
console.log('f says: ' + f);

它依赖于JS在某些情况下通过.toString方法进行类型转换的事实。
答案 1 :(得分:0)
可以使用valueOf
var foo = function() {
console.log("From Function");
return "Function";
};
foo.valueOf = function() {
return "Variable";
};
alert( 'Output is: ' + foo() )
alert( 'Output is: ' + foo )
使用JavaScript无法做到这一点,因为对象中的项目可以是两个不同的对象。
如果你想要一个属性作为一个函数和一个对象,那就不一样了
答案 2 :(得分:0)
注意,使用setTimeout
var foo = (function() {
var fn = function() {
return foo && typeof foo === "string" ? function() {
return "foobar"
} : "bar";
};
setTimeout(function() {
foo = fn()
});
return fn()
}());
console.log(foo); // `"bar"`
setTimeout(function() {
console.log(foo()); // `"foobar"`
});