【问题标题】:Ensuring Scope for Functions确保功能范围
【发布时间】:2018-08-15 03:41:40
【问题描述】:

我编写了一些正在运行的代码,我的下一场战斗是重构,我认为在范围方面我做错了一些事情。我正在检索消息数据并尝试对其进行修改:

function handleMessage(message) {
if(message.includes('dns')) {
    // Take the data I want and re-organize for the API to use
    // This removes the user ID text <@XXXXXXXXX>
    var buf1 = Buffer.allocUnsafe(26);
    buf1 = message;
    buf2 = buf1.slice(13, buf1.length);
    message = buf2.toString('ascii', 0, buf2.length);

    /* There may be a better way with the Slack API, but this will work
    returns URL as a string without extra formatting. Pre-formatted text appears like:
    <http://webbhost.net|webbhost.net> */
    var n = message.indexOf('|');
    var o = message.indexOf('>');
    var n = n+1;
    var o = o-2;
    var s1 = message.substr(n, o);
    var p = s1.indexOf('>');
    var s2 = s1.substr(0, p);
    message = s2;
    dnsLookup(message);

} else if(message.includes(' whois')) {
    // Take the data I want and re-organize for the API to use
    // This should probably be it's own function
    var buf1 = Buffer.allocUnsafe(26);
    buf1 = message;
    buf2 = buf1.slice(13, buf1.length);
    message = buf2.toString('ascii', 0, buf2.length);

    var n = message.indexOf('|');
    var o = message.indexOf('>');
    var n = n+1;
    var o = o-2;
    var s1 = message.substr(n, o);
    var p = s1.indexOf('>');
    var s2 = s1.substr(0, p);
    message = s2;
    whoisLookup(message);
}

很明显,我在这里重复了很多代码,我想从中创建 2 个函数。现在我尝试在这个函数中这样做,看起来当我确实将它们设置为我不会永久更新我发送的变量的函数时(当我检查第一个函数的结果和开始时第二,它看起来像在第一个函数运行之前)。

我还需要以其他方式查看此问题吗?我可以将其作为一个功能来执行,但我正在努力为将来可能遇到的其他情况提供面向未来的证明。

这是我修改后的样子:

function handleMessage(message) {
function removeID(message) {
    var buf1 = Buffer.allocUnsafe(26);
    buf1 = message;
    buf2 = buf1.slice(13, buf1.length);
    message = buf2.toString('ascii', 0, buf2.length);

    console.log(message);
    }
function removeSlackURL(message){
    console.log("test");
    console.log(message);
    var n = message.indexOf('|');
    var o = message.indexOf('>');
    var n = n+1;
    var o = o-2;
    var s1 = message.substr(n, o);
    var p = s1.indexOf('>');
    var s2 = s1.substr(0, p);
    message = s2;

}
if(message.includes('dns')) {
    // Take the data I want and re-organize for the API to use
    // This removes the user ID text <@XXXXXXXXX>


    removeID(message);
    removeSlackURL(message);

【问题讨论】:

  • var n = n+1; 应该做什么?如果您已经声明了变量,请从分配中删除 vars。
  • 学究式地,函数是值并且没有范围。但你的意思是引用函数的变量的范围。

标签: javascript function scope


【解决方案1】:

每当您将message 传递给函数时,您都会将对字符串的引用传递给一个单独的变量,该变量的范围仅限于该函数。如果您为函数内的message 变量分配不同的字符串,它实际上会将该引用重新分配给新值,而不会以任何方式影响原始message。 相当于:

var a = 2;
var b = a; //b = 2
b = 3;
console.log(a); //2

这里的a 是你原来的message,它被传递给函数内部名为message 的变量,类似于这里的b

保持更改持久的最佳方法是从所有函数返回最终修改后的字符串,并使用返回的值替换初始值。

function handleMessage(message){
  function removeID(message){
     ....
     ....
     return buf2.toString('ascii', 0, buf2.length);
  }

  function removeSlackURL(message){
     console.log("test");
     console.log(message);
     var n = message.indexOf('|');
     var o = message.indexOf('>');
     var n = n+1;
     var o = o-2;
     var s1 = message.substr(n, o);
     var p = s1.indexOf('>');
     var s2 = s1.substr(0, p);
     message = s2;
     return message;
  }

  if(message.includes('dns')) {
      // Take the data I want and re-organize for the API to use
      // This removes the user ID text <@XXXXXXXXX>


      message = removeID(message);
      message = removeSlackURL(message);

  ....
  ....
  return message;
}

【讨论】:

    【解决方案2】:

    变量在 javascript 中具有函数作用域。消息已经是外部函数的函数变量,外部函数内部的函数不需要在其中包含消息变量。

    内部函数可以访问外部函数的变量。

    function handleMessage(message) {
      function removeID() {
        var buf1 = Buffer.allocUnsafe(26);
        buf1 = message;
        buf2 = buf1.slice(13, buf1.length);
        message = buf2.toString('ascii', 0, buf2.length);
    
        console.log(message);
      }
      function removeSlackURL(){
        console.log("test");
        console.log(message);
        var n = message.indexOf('|');
        var o = message.indexOf('>');
        var n = n+1;
        var o = o-2;
        var s1 = message.substr(n, o);
        var p = s1.indexOf('>');
        var s2 = s1.substr(0, p);
        message = s2;
    
      }
      // doing this on either cases
      removeID();
      removeSlackURL();
      if(message.includes('dns')) {
        // Take the data I want and re-organize for the API to use
        // This removes the user ID text <@XXXXXXXXX>
      } else if (message.includes()) {
    
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-25
      • 2021-01-21
      • 1970-01-01
      • 2014-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-01
      相关资源
      最近更新 更多