Edit in JSFiddle

const workerFunction = () => {
	self.onmessage = (message) => {
  	const isPrime = (candidate) => {
      for (let i = 2; i <= Math.floor(Math.sqrt(candidate)); i++) {
        if (candidate % i === 0) return false;
      }
      return true;
    }

  	let view = new Uint8Array(message.data);
    let count = 0;
    
    for (let i = 0; i < view.length; i++) {
      let candidate = i + 2;
      let result = isPrime(candidate);
      if (result) count++;
      view[i] = result;
    }
    
    self.postMessage({
    	buffer: view.buffer,
      count
    });
  }
}

const hackFunctionToBuffer = (f) => {
	return URL.createObjectURL(new Blob([`(${f.toString()})()`],
  { type: 'application/javascript' }))
}

const startTest = () => {
	// same buffer size as before
	let buffer = new ArrayBuffer(1024 * 1024 * 2)
  let view = new Uint8Array(buffer);
  
  let workerBlob = hackFunctionToBuffer(workerFunction);
    
  performance.mark('startTest');
  let worker = new Worker(workerBlob);
  worker.onmessage = (message) => {
  	performance.mark('endTest')
    performance.measure('primes', 'startTest', 'endTest');
    document.getElementById('performance').innerHTML = `Found ${message.data.count} in ${performance.getEntriesByName('primes')[0].duration} ms`;
    URL.revokeObjectURL(workerBlob);
  }
	worker.postMessage(buffer);
}
document.getElementById('test').addEventListener('click', startTest);
<button id="test">Start Test</button>
Results:<br />
<pre id="performance">Nothing yet...</pre>