为什么这个node.js回调有效?

时间:2015-07-07 00:27:19

标签: javascript node.js scope

我一直认为这些回调有自己的范围。这是怎么回事?

Eton_file_sync.prototype.add_file_listener = function(filename){
    //use chokidar to make a watcher for the filename
    var watcher = this.chokidar.watch(filename, {
        ignored: /[\/\\]\./,
        persistent: true
    });
    var some_variable = 1;
    watcher.on('change', function(path) {
        console.log ('File', path, 'has been changed');
        console.log (some_variable);
    });
};

通过更改文件来调用它时,为什么some_variable的输出实际上有效?

File buffercont.asc has been changed
1

1 个答案:

答案 0 :(得分:1)

他们有自己的范围。如果从事件处理程序回调中定义该变量的值,则只需定义该范围内的值,但不会影响父范围。

var some_variable = 1;
console.log(some_variable); // prints "1"
var callback = function() {
    var some_variable = 5;
    console.log (some_variable); // prints "5"
};
callback();
console.log(some_variable); // prints "1"

请注意,在上面的示例中,定义函数内部的变量并未在函数外部更改它。每个函数都带有一个范围链,与其创建的范围链相同。您可以随时访问链中较高的变量,除非它们已经在链中被进一步覆盖,如上例所示。