有什么方法可以监控 NodeJS 中的原始字符串声明吗?例如,当我这样做时,"test";
是否有任何方法可以触发特殊事件"test"
作为参数?
2 回答
我不确定您所说的“测试”是什么意思;; 但是,如果您想在为变量分配新值时触发事件,不,没有办法为变量更改触发事件。
如果你想观察一个变量,最好重新设计你的系统来进行调用,而不是分配一个变量。而不是这样做:
running_mode = "test";
要求
switch_mode("test");
并调用您想在此更新上触发的任何事件处理程序。
如果你真的想观察一个全局变量的值,你可以通过在主循环的每一轮检查一次值来做到这一点:
function is_mode_changed() {
if (running_mode=="test") event_handler();
process.nextTick(is_mode_changed);
}
一旦调用此函数,它将在主循环的每一轮中继续运行一次。如果你想做的是像跟随一个变量不时地做一些特定的任务,比如跟随一个全局计数器并在每次计数器达到 1000 时执行一些清理任务,这是一个很好的方法。如果你想在变量改变后立即做某事,那是不可能的。
我希望我能正确理解你的问题。
更新
[我在下面的评论中添加了这一点,因为我误解了它,所以上面的所有内容都与问题无关。]
正如您自己提到的那样,字符串文字就像"test"
是一个原始值,它不是一个对象。因此,它由解释器以我们无法更改的方式处理。
来自 Ecma-262:
4.3.2 原始值
第 8 条中定义的类型
Undefined
,Null
,Boolean
,Number
或之一的成员String
注意:原始值是直接在语言实现的最低级别表示的数据。
为防止混淆,第 8 条是上面列出的类型标准部分。
Since you specified V8, and not per-spec-ECMAScript, you have more concrete options at your disposal. In the V8 API there is classes/templates or primitives that are separate from those of object wrappers for primitives. In order to be able to hook in a way to know when this actually happens would likely require modifying v8 in a custom manner, but it is doable.
http://code.google.com/p/v8/source/browse/branches/bleeding_edge/include/v8.h#1017
Also much of the action takes place in js itself. Perhaps not the very constructor itself, but everything that happens thereafter. String.prototype.toString/valueOf.
http://code.google.com/p/v8/source/browse/branches/bleeding_edge/src/string.js