前言
现有一段类型为 String 的 JS 代码,如何执行这段 JS代码
"console.log(a)"
方法一:eval
代码同步执行且作用域为当前作用域
var a = 1
function fn(str) {
var a = 2
eval(str)
}
const str = 'console.log(a)'
fn(str)
方法二:setTimeout
setTimeout
第一个参数除了传回调函数,还可以传字符串
var a = 1
function fn(str) {
var a = 2
setTimeout(str, 0)
}
const str = 'console.log(a)'
fn(str)
console.log("sync")
方法三:script标签
同步且为全局作用域
var a = 1
function fn(str) {
var a = 2
const script = document.createElement('script')
script.innerHTML = str
document.body.appendChild(script)
}
const str = 'console.log(a)'
fn(str)
console.log("sync")
方法四:Function
同步且为全局作用域
var a = 1
function fn(str) {
var a = 2
const f = new Function(str)
f()
}
const str = 'console.log(a)'
fn(str)
console.log("sync")
区别
eval | setTimeout | script标签 | Function | |
---|---|---|---|---|
执行机制 | 同步执行 | 异步执行 | 同步执行 | 同步执行 |
作用域 | 当前作用域 | 全局作用域 | 全局作用域 | 全局作用域 |