({
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
影响。纯属瞎猜,以上。
另外代码少了一个
}
。。。