/* 22 */
var a = 2;
function Fun() {
this.a = 1;
// var a = 3;
setTimeout(function() {
console.log('Fun() a=', this.a);
}, 0);
}
// var fun = new Fun(); //2
Fun(); //1
//为什么上面两条语句会输出不一样的结果呢
//使用new生成一个Fun对象时打印出来的是2
//在调用函数Fun时打印出来的是1
//因为使用new生成一个Fun对象的时候根本就没有去调用this.a这条语句
//var fun = new Fun();这条语句的过程是,先生成一个fun对象
//然后再将fun对象的this指针指向Fun函数,这条语句仅仅只是在改变对象fun
//的指针指向函数Fun更被没有执行,所以语句this.a = 1这条赋值语句也就不会起作用
//所以输出的为2
//而直接在全局作用域下调用Fun函数的话赋值语句this.a = 1就会执行,而又因为函数
//Fun是在全局作用域下定义的所以执行的时候打印出来的是1
// console.log(a);
/* 23 */
/* var s = 3;
function B() {
// var s = 6;
this.s = 6;
// console.log('在B()运行时打印全局window下的this.s', this.s);
setTimeout(function() {
console.log('在B()运行时打印全局window下的this.s', this.s);
}, 0);
A();
}
function A() {
this.s = 10
// var s = 10;
setTimeout(function() {
console.log('A() s=', this.s);
}, 0);
}
B();
// var bb = new B();
//使用new操作符生成bb对象或者是
//直接B()调用B函数时内部都会执行A()
//而在A函数内部this.s会改变全局变量window.s
//为什么会改变window.s呢,因为函数A时在全局作用域下定义的(而函数又是在定义它们的作用域里运行,而不是在执行它们的作用域里运行
//所以即使函数A是在函数B中运行的,但是它打印出来的仍旧是全局下的s)
//而且函数B也是在全局作用域下定义的,准确来说s的变化过程是
//3->6->10(这是在函数A、B中使用this.s的情况下回改变全局变量s)
//如果在函数A、B内部使用var重新定义一个s并不会改变全局中的s
//因为函数B是在全局作用域下执行的,所以它的this是指向全局作用域的
//所以最后的最后函数A中的定时器的打印语句打印出来的是A() s= 10
//而在函数B中的打印语句打出来的是s=6
console.log(s); */