是否可以使变量每次出现时都调用一个函数?

时间:2020-02-05 10:07:26

标签: javascript

注意:此问题与现有问题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

但是是否可以使非全局变量具有这样的行为?

就像用constlet定义的一样。

它必须是一个独立变量,不能是obj.foo之类的其他对象的点符号。

function bar() {
  console.log('test');
  return 42;
}

const foo = ???;

foo;    // 'test'

let a = foo;    // 'test'

let b = foo + foo;  // 'test' twice

我尝试了Symbol.toPrimitivevalueOftoString等,但并非在所有情况下都有效:

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

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

不。如果变量是独立变量(用const / let / var声明),并且不在顶层,则当变量名称出现时,无法运行自定义Javascript代码只是引用

换一种说法,引用一个独立的变量名是 pure -它本身不会有任何副作用,除非代码的其他部分对其有所作​​用(例如,与您的{{1} }示例)。

答案 1 :(得分:1)

不。

window方法之所以有效,是因为您未在窗口上定义 variable,而是实际上是一个属性。结合JS如何进行可变分辨率,最终得到了上述的行为。

实现您想要做的事情的唯一方法可能是访问当前作用域以及所有clojure作用域,等等,但这不可用。