--- sidebar_label: ExecutionContext.evaluateHandle --- # ExecutionContext.evaluateHandle() method Evaluates the given function. Unlike [evaluate](./puppeteer.executioncontext.evaluate.md), this method returns a handle to the result of the function. This method may be better suited if the object cannot be serialized (e.g. `Map`) and requires further manipulation. **Signature:** ```typescript class ExecutionContext { evaluateHandle< Params extends unknown[], Func extends EvaluateFunc = EvaluateFunc >( pageFunction: Func | string, ...args: Params ): Promise>>>; } ``` ## Parameters | Parameter | Type | Description | | ------------ | -------------- | ----------------------------------------------- | | pageFunction | Func \| string | The function to evaluate. | | args | Params | Additional arguments to pass into the function. | **Returns:** Promise<[HandleFor](./puppeteer.handlefor.md)<Awaited<ReturnType<Func>>>> A [handle](./puppeteer.jshandle.md) to the result of evaluating the function. If the result is a `Node`, then this will return an [element handle](./puppeteer.elementhandle.md). ## Example 1 ```ts const context = await page.mainFrame().executionContext(); const handle: JSHandle = await context.evaluateHandle(() => Promise.resolve(self) ); ``` ## Example 2 A string can also be passed in instead of a function. ```ts const handle: JSHandle = await context.evaluateHandle('1 + 2'); ``` ## Example 3 Handles can also be passed as `args`. They resolve to their referenced object: ```ts const bodyHandle: ElementHandle = await context.evaluateHandle( () => { return document.body; } ); const stringHandle: JSHandle = await context.evaluateHandle( body => body.innerHTML, body ); console.log(await stringHandle.jsonValue()); // prints body's innerHTML // Always dispose your garbage! :) await bodyHandle.dispose(); await stringHandle.dispose(); ```