eval
作用
将传入的字符串当做 JavaScript 代码进行执行
实例
function foo(str, a) {
eval(str)
console.log(a, b)// 1 3
}
var b = 2;
foo("var b = 3", 1);
console.log(globalThis.b);// 2
with
作用
扩展一个语句的作用域链
实例
let obj = {
a: 1,
b: 2,
c: 3
}
// 单调乏味的重复"obj"
obj.a = 2
obj.b = 3
obj.c = 4
// 简单的快捷方式
with (obj) {
a = 3
b = 4
c = 5
}
console.log(obj) //{ a: 3, b: 4, c: 5 }
缺点
会导致内存泄漏
function foo(obj){
with (obj) {
a = 2
}
}
let objqq = {}
foo(objqq)
console.log(objqq) // {}
console.log(a) // 2 -- 不好,a被泄漏到全局作用域上
例题
var obj = {
x:1,
xyz:function(){
with(this){
function con(){
console.log(x)
console.log(this.x)
}
var x = 2 // this.a = 2 var this.a
;(function(){
con() // this指向 window
})()
con.call(this)// this指向 obj
}
}
}
obj.xyz()// 2 undefined 2 2
eval 和with 的副作用
引擎无法在编译时对作用域查找进行优化