({
x: 10,
foo: function () {
function bar() {
console.log(x);
console.log(y);
console.log(this.x);
}
with (this) {
var x = 20;
var y = 30;
bar.call(this);
}
}
}).foo();
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
等价转换为==>
with语句中的变量x,y声明提前到函数顶部;
with关键字会将with对应的对象添加到当前其所在函数作用域链的头部位置,也就是with语句块中的属性首先从头部位置的对象开始找,找不到再往上...等with语句执行完后,会恢复原来你的函数作用域链。
对于以上的问题:
obj.foo();执行,[4]处的this为obj对象,[5]x=20;obj有x属性,故obj.x属性值被更新为20,foo函数体的x变量值没有被赋值;[6]y=30;obj没有y属性,故foo函数体中的变量赋值为30;bar.call(this);执行时,obj的属性x值为20,[1]输出为undefined[2]输出为30[3]输出为20[8]输出为undefined[9]输出为999不要用with,也不用去学 何乐而不为