【问题标题】:Javascript global variable not working & moreJavascript全局变量不起作用等等
【发布时间】:2014-09-29 07:01:25
【问题描述】:

我对下面的代码有几个问题:

  • 我在第 11 行定义了一个名为 iMax 的全局变量。但是,如果我尝试在第 17 行调用它,它将不起作用。为什么?[已回答]

  • 由于节点模块 'cheerio' 和 'request',此脚本无法在 Web 浏览器中运行,但它可以在本地命令提示符下运行。有什么办法可以让另一个 确实 在网页中运行的 javascript 与共享变量并执行此 javascript 以在网页外(本地)运行?这两个 javascript 将位于同一目录中。 [未答复]

  • 当我删除 'urls = [];'从第 3 行开始,奇怪的是,我收到一条错误消息:

    request('http://forum.blockland.us/index.php?action=profile;u=137487;sa=showPosts'
    SyntaxError:意外的令牌 (

    这对我来说毫无意义,因为 'urls = [];'在代码中没有目的。任何想法为什么会发生这种情况? [已回答]

-

1    var request = require('request'),
2       cheerio = require('cheerio'),
3       urls = [];
4    
5       
6    request('http://forum.blockland.us/index.php?action=profile;u=137487;sa=showPosts', function(err, resp, body){
7       if(!err && resp.statusCode == 200){
8           var $ = cheerio.load(body);
9           $('b:contains(...)', 'tr.catbg3').each(function(){
10              totalPages = $(this).next().text();
11              iMax = (totalPages - 1) * 15;
12          });
13      }
14    });
15    
16    
17    for(i = 0; i <= iMax; i += 15)
18    {
19      console.log(i);
20    }

【问题讨论】:

  • 异步 JavaScript 不会有问题吗?
  • 虽然声明的变量是在执行任何代码之前创建的,但隐式全局变量在创建它们的表达式执行之前不存在。所以 iMax 在请求返回之前不会创建,但是您会在调用 request 后立即尝试访问它。
  • 请在每个帖子中坚持一个问题。这个问题的答案变得一团糟。
  • 是的,我明白你的意思(我最初打算为每个问题设置数字以便更有条理)。这是我在这个论坛上发布的第一个问题,所以我还不知道绳索。我来自一个论坛,即使是重复发帖也不受欢迎。

标签: javascript node.js global-variables


【解决方案1】:

用 } 声明 var iMax ={一个你喜欢的默认值;在顶部。

现在您实际上是在实际声明 iMax 之前调用该 for 循环。

【讨论】:

    【解决方案2】:

    “当你只有一把锤子时,一切看起来都像钉子”。您没有以正确的方式使用正确的技术来实现您的目标。

    在浏览器中运行的 JavaScript 在客户端的沙箱中运行,因此在服务器上设置全局变量以运行 node.js 实例可能是不切实际的。

    您可能需要一个轻量级的 Web 服务器...如果您愿意,Node 可以为您完成此任务并吞下 POST。一个简单的 HTTP 服务器是最早的 Node.js 教程之一。然后你就可以用 POST 的信息做你想做的事了。

    确实,一个带有脚本模块的简单网络服务器可以传递信息并运行 node.js 可能是可持续地执行此操作的最简单方法。

    其他张贴者是正确的,注意 JavaScript 中的单行上的多个语句,这被认为是不好的做法。

    【讨论】:

    • 我无法找到“简单的 HTTP 服务器”Node.js 教程。老实说,我对你提到的那些东西非常不熟悉(我是 3 天前开始写 javascript 的,哈哈)
    【解决方案3】:

    您可能应该在调用请求之前定义变量:var iMax; 在全局范围内或使用window.iMax = (totalPages - 1) * 15;。但实际上你应该在请求函数中使用for循环,否则如果你没有设置iMax,它可能是不必要的。

    【讨论】:

    • 在第 13 行和第 14 行的内容之间插入 for 循环是可行的。惊人的。现在我只需要其他 2 个问题的答案。
    【解决方案4】:

    当您删除带有urls = []; 的行时,您实际上也删除了分号符号;

    这使得下一行成为声明行,这意味着 cheerio = require('cheerio'), 行之后的所有内容都成为变量的另一个声明。糟糕的语法错误。

    所以,请删除urls = []; 行,但用分号替换逗号,这样您就有cheerio = require('cheerio');

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-13
      • 1970-01-01
      • 1970-01-01
      • 2016-12-30
      相关资源
      最近更新 更多