javascript回调闭包未定义变量

javascript回调闭包未定义变量,javascript,node.js,phantomjs,Javascript,Node.js,Phantomjs,我今天遇到了新情况。我想在节点中使用phantomjs,并正在设置PhantomNPM模块。问题在于如何获得“document.title”。请看一下他们网站上的示例代码 他们是如何将文档注入回调函数的?通常情况下,它会在回调中作为参数传递,但不知何故,文档在没有通过回调参数传递的情况下是可用的 有人能解释一下这是怎么做到的吗?还有一个解释,为什么有人会这样做,而不仅仅是通过参数 var phantom; phantom = require('phantom'); phantom.creat

我今天遇到了新情况。我想在节点中使用phantomjs,并正在设置PhantomNPM模块。问题在于如何获得“document.title”。请看一下他们网站上的示例代码

他们是如何将文档注入回调函数的?通常情况下,它会在回调中作为参数传递,但不知何故,文档在没有通过回调参数传递的情况下是可用的

有人能解释一下这是怎么做到的吗?还有一个解释,为什么有人会这样做,而不仅仅是通过参数

var phantom;

phantom = require('phantom');

phantom.create(function(ph) {
  return ph.createPage(function(page) {
    return page.open("http://www.google.com", function(status) {
      console.log("opened google? ", status);
      return page.evaluate((function() {
        return document.title;
      }), function(result) {
        console.log('Page title is ' + result);
        return ph.exit();
      });
    });
  });
});

也许正如本文所解释的,PhantomJS有一个特殊的特性,它在全局范围内放置(创建)
窗口
文档
对象

通常,这是通过在不使用
var
关键字的情况下为变量赋值来实现的

范例

var test = function(cb){
    document = 'test';
    cb();
}

test( function(){
    console.log(document);
});

所以这意味着我可以在wards之后在我的应用程序中的任何其他地方引用文档,并且文档应该可用?正确,一旦任何正在运行的脚本在全局范围内定义了
document
,而没有
var
关键字,未来任何运行的代码都可以在任何地方访问该变量。将其放入全局空间而不是作为参数传递的原因是什么?我猜测PhantomJS为什么这样做是为了更好地模拟真实web浏览器的环境,
document
window
始终是全局变量,因此,它可以在不需要修改的情况下使用现有脚本。