注意:此问题与现有问题Javascript make variable a function that calls itself every time it's referenced
不同
我知道可以将全局变量用作getter函数。
每次调用它时,getter函数都会触发。
function bar() {
console.log('test');
return 42;
}
Object.defineProperty(window, 'foo', {
get: bar
});
foo; // 'test'
let a = foo; // 'test'
let b = foo + foo; // 'test' twice
但是是否可以使非全局变量具有这样的行为?
就像用const
或let
定义的一样。
它必须是一个独立变量,不能是obj.foo
之类的其他对象的点符号。
function bar() {
console.log('test');
return 42;
}
const foo = ???;
foo; // 'test'
let a = foo; // 'test'
let b = foo + foo; // 'test' twice
我尝试了Symbol.toPrimitive
,valueOf
和toString
等,但并非在所有情况下都有效:
function bar() {
console.log('test');
return 42;
}
const foo = {
[Symbol.toPrimitive]: bar,
toString: bar,
valueOf: bar
};
foo;
let a = foo;
let b = foo + foo; // 'test' twice
有什么想法吗?
答案 0 :(得分:3)
不。如果变量是独立变量(用const
/ let
/ var
声明),并且不在顶层,则当变量名称出现时,无法运行自定义Javascript代码只是引用。
换一种说法,引用一个独立的变量名是 pure -它本身不会有任何副作用,除非代码的其他部分对其有所作用(例如,与您的{{1} }示例)。
答案 1 :(得分:1)
不。
window
方法之所以有效,是因为您未在窗口上定义 variable
,而是实际上是一个属性。结合JS如何进行可变分辨率,最终得到了上述的行为。
实现您想要做的事情的唯一方法可能是访问当前作用域以及所有clojure作用域,等等,但这不可用。