({
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();
上面的代码是 http://dmitrysoshnikov.com/ecmascript/the-quiz/ 中的第九题,
请问为什么console.log(x)输出undefined
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
声明提升
var声明会被提升到函数作用域顶部,方法可以改写为
with作用域
在with作用域里寻找变量的时候先去with对象里找,找不到时按照正常的闭包的方式找,见下注释(注意注释前的数字顺序)
sorry,搞错了。
这里的关键点在于with(this),with的作用是设置代码在特定对象中的作用域。简单理解就是在with范围内的变量,就是this对象的变量,无需再写this.x。所以
因为
实际上相当于两个分开的语句―
变量声明时,在
with中声明的变量相当于被提升到函数顶部,因此具有函数作用域,所以x和y都是是这个对象的foo函数所可以访问的标识符,而bar在其内部,所以x和y属性均可访问。而在赋值时,
with作用域优先,而with的作用域已经有x了,赋值时直接对this.x赋值,函数作用域的x保持undefined. 相反,标识符y在with作用域不存在,所以对函数作用域的y赋值。而函数
bar不受with影响。纯属瞎猜,以上。
另外代码少了一个
}。。。