【问题标题】:Can't access variable in a function无法访问函数中的变量
【发布时间】:2016-02-12 11:18:34
【问题描述】:

我是 nodejs 的新手。我已经阅读了很多文章,无法弄清楚以下代码有什么问题。它给出的错误 checkForActivity 没有定义。任何帮助将不胜感激。

var net = require('net');
net.createServer(function(sock){
    var checkForActivity = false;
    sock.on('data',function(data){
       changeCheckForActivity();
    });
});

function changeCheckForActivity(){
    checkForActivity = true;
}

【问题讨论】:

    标签: javascript node.js scope


    【解决方案1】:

    checkForActivity 仅在createServer() 范围内定义。在changeCheckForActivity() 中,尚未定义createServer() 是否为异步且无论如何不可见。

    var net = require('net');
    var checkForActivity = false;
    net.createServer(function(sock){
        sock.on('data',function(data){
           changeCheckForActivity();
        });
    });
    
    function changeCheckForActivity(){
        checkForActivity = true;
    }
    

    可能更好的解决方案是:

    var net = require('net');
    net.createServer(function(sock){
        changeCheckForActivity(false);
        sock.on('data',function(data){
           changeCheckForActivity(true);
        });
    });
    
    function changeCheckForActivity(isAct){
        // do something in reaction to activity
        // isAct is now a local replacement for 
        // checkForActivity 
    }
    

    【讨论】:

    • 其实我想要每个socket的那个变量,有一些逻辑依赖于那个变量。
    • function(data){ changeCheckForActivity(); }); 已经是一个回调
    • 查看第二个去掉checkForActivity的版本
    【解决方案2】:

    checkForActivity 在函数中定义,因此它在函数scope 中。在函数changeCheckForActivity() checkForActivity 的范围内尚未定义。如果你在函数之外定义checkForActivity,那么两个函数都可以访问它:

    var net = require('net');    
    var checkForActivity = false;
    net.createServer(function(sock){
        sock.on('data',function(data){
            changeCheckForActivity();
        });
    });
    
    function changeCheckForActivity(){
        checkForActivity = true;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 2018-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-08
      相关资源
      最近更新 更多