function CreateNewFunctionObject(FormalParameterList, FunctionBody, Scope, Strict) {
var F = new Object;
// set internal methods of F to 8.12, except for [[Get]]
delete F.[[Get]]; // (because the other properties are set by default...?)
F.[[Class]] = "Function";
F.[[Prototype]] = CreateFunctionPrototype; // see 15.3.3.1
F.[[Get]] = CreateFunctionGet; // see 15.3.5.4;
F.[[Call]]] = CreateFunctionCall; // see 13.2.1
F.[[Construct]] = CreateFunctionConstruct; // see 13.2.2
F.[[HasInstance]] = CreateFunctionHasInstance; // see 15.3.5.3
F.[[Scope]] = Scope;
var names = FormalParameterList; // List of strings, names of parameters from left to right. call evaluate?
F.[[FormalParameters]] = names;
F.[[Code]] = FunctionBody;
F.[[Extensible]] = true;
var len = names.length;
F.[[DefineOwnProperty]]("length", PD{[[Value]]:len, [[Writable]]:false, [[Enumerable]]:false, [[Configurable]]:false}, false);
var proto = new Object;
proto.[[DefineOwnProperty]]("constructor", PD{[[Value]]:F, [[Writable]]:true, [[Enumerable]]:false, [[Configurable]]:true}, false);
F.[[DefineOwnProperty]]("prototype", PD{[[Value]]:proto, [[Writable]]:true, [[Enumerable]]:false, [[Configurable]]:false}, false);
if (Strict) {
var thrower = [[ThrowTypeError]]; // 13.2.3
F.[[DefineOwnProperty]]("caller", PD{[[Get]]:thrower, [[Set]]:thrower, [[Enumerable]]:false, [[Configurable]]:false}, false);
F.[[DefineOwnProperty]]("arguments", PD{[[Get]]:thrower, [[Set]]:thrower, [[Enumerable]]:false, [[Configurable]]:false}, false);
}
return F;
}