题目: 以下代码执行后输出的值分别是?
var o={
x: 10,
foo: function () {
with (this) {
function bar() {
alert(x);
alert(this.x);
}
var x=20;
(function() {
bar();
})();
bar.call(this);
}
}
}
o.foo();
我不明白的:
第二行x : 10和直接写x = 10有什么区别吗?
第四行with(this),作用应该是延长作用域链?那在本题中具体是什么情况?
在var x = 20后,再次调用bar()为什么第一个是undefined,第二个是20?
感觉这道题考察的蛮多的,拿出来和大家讨论下。题目测试结果:undefined, undefined, undefined, 20.
==在o对象中没有定义bar函数的情况下等价的代码为====
那么假设o中
没有属性x,会是什么结果呢
如果去的o对象中的x属性,将其修改为全局变量的会是什么结果呢
结果输出为 20,10,20,undefined
就是如果with包裹的对象如果没有对应的属性x的,那么x就会变为局部变量-如果函数中声明的话,或成为全局变量-如果函数中没有声明过的话。在当前的函数中x就成为foo函数的局部变量。
bar函数第1次执行,因为bar有闭包,所以
console.log(x);
输出20;this为全局对象,所以console.log(this.x);
输出10。
bar.call(this);
将o作为函数执行上下文,this就为o,o没有属性x,所以输出为 20,undefined
如果代码这样执行
那么输出输出为undefined 20 undefined 20
因为with(this) this为全局对象,全局对象有属性x,故其值被设置为20,而foo指向的函数中的定义的内部变量x没有被赋值,为undefined