Q:

Why I can't directly use result of webPage.create() in Phantomjs?

I am using phantomjs to create Base64 screenshots of pages. I have got something, I really don't quite understand. Here is my code: 
var webPage = require('webpage');

var page = webPage.create();

page.open('http://example.com', function (status) {
  var base64 = page.renderBase64('PNG');
  console.log(base64);
  phantom.exit();
});

What I wonder is why I can't use result of webPage.create() immediately? 
For instanse this code won't finish:
var webPage = require('webpage');

webPage.create().open('http://example.com', function (status) {
  var base64 = page.renderBase64('PNG');
  console.log(base64);
  phantom.exit();
});

A:

By default, there is no object named page, so, you need to create it:
var page = require('webpage').create({viewportSize:{width: 1600,height: 900},
settings:{userAgent:'Mozilla/5.0 (X11; Linux x86_64; rv:49.0) Gecko/20100101 Firefox/49.0',
javascriptEnabled:'true',
loadImages:'true'
}});

After that, you can use it as usual, for example: page.renderBase64('PNG');
Or you may use the pointer named this (a reference to the current object):
require('webpage').create().open('http://example.com',function(status){
  var base64 = this.renderBase64('PNG');// You can use "this", instead of the object name.
  console.log(base64);
  phantom.exit();
});

Or the same, but with an additional settings for the create() function:
var obj={viewportSize:{width: 1600,height: 900},
settings:{userAgent:'Mozilla/5.0 (X11; Linux x86_64; rv:49.0) Gecko/20100101 Firefox/49.0',
javascriptEnabled:'true',
loadImages:'true'
}}// The additional settings for the create() function.

require('webpage').create(obj).open('http://example.com',function(status){
  var base64 = this.renderBase64('PNG');// You can use "this", instead of the object name.
  console.log(base64);
  phantom.exit();
});

