{"ScriptPreparationCode":"function wrapExplicit(fn) {\r\n return function(a1, a2, a3) {\r\n return fn.call(this, this, a1, a2, a3)\r\n }\r\n}\r\n\r\nfunction wrapApply(fn) {\r\n return function() {\r\n var args = [this]\r\n\tfor (let i = 0, len = arguments.length; i \u003C len; i\u002B\u002B) {\r\n args[i \u002B 1] = arguments[i]\r\n \t}\r\n \treturn fn.apply(this, args)\r\n }\r\n}\r\n\r\nfunction wrapApplyWithArguments(fn) {\r\n return function() {\r\n \treturn fn.apply(this, [this].concat(arguments))\r\n }\r\n}\r\n\r\nfunction fn(thisArg, a1, a2, a3) {\r\n thisArg.result = a1 \u002B a2 \u002B a3\r\n}\r\n\r\nvar explicitCall = { fn: wrapExplicit(fn) }\r\nvar applyCall = { fn: wrapApply(fn) }\r\nvar applyWithArgumentsCall = { fn: wrapApplyWithArguments(fn) }","TestCases":[{"Name":"Explicit call","Code":"explicitCall.fn(Math.random(), Math.random(), Math.random())","IsDeferred":false},{"Name":"Apply call","Code":"applyCall.fn(Math.random(), Math.random(), Math.random())","IsDeferred":false},{"Name":"Apply with arguments call","Code":"applyWithArgumentsCall.fn(Math.random(), Math.random(), Math.random())","IsDeferred":false}]}