(0, eval)()用法示例和简单解析

分组远算符()

  1. 分组运算符里面可以是表达式, 也可以是字面量的值
  2. 此算法不将GetValue应用于计算Expression(表达式)的结果.这样做的主要原因是,诸如delete和typeof等操作符可以应用于括号表达式

逗号运算符

  1. 逗号运算符对于它的每个操作数求值(从左到右), 并返回最后一个操作数的值
  2. (0, person.getName)产生了赋值操作,等同于(const getName = person.getName)()
  3. this: 全局对象, window
var varNum = 10
function evalCode() {
eval(`var varNum=20`)
}
function evalCode2() {
(0, eval)(`var varNum=30`)
}
console.log('varNum:', varNum)//varNum: 10
evalCode()
console.log('varNum:', varNum)//varNum: 20
evalCode2()
console.log('varNum:', varNum) // varNum: 30
let name = 'let的name'
const person = {
    name: 'person的name',
    getName() {
        console.log(this)
        return this.name
    }
}
const getName = person.getName
try {
    const r1 = getName()
    console.log('r1:', r1) // undefined, this是window
    const r2 = person.getName()
    console.log('r2:', r2)//r2: person的name, this是person
    const r3 = (person.getName)()
    console.log('r3:', r3)//r3: person的name, this是person
    const r4 = (0, person.getName)()
    console.log('r4:', r4)// undefined, this是window
} catch (error) {
    console.log(err)
}
var variable = 10;
;(function (){
  var variable = 20;
	(0, eval)('console.log(variable)'); // 10, 因为要去全局作用域找
  (eval)('console.log(variable)'); // 20, 因为在块作用域找
})()

你可能感兴趣的:(JavaScript面试问题,this,javascript,前端,开发语言)