作用域闭包、变量预解释和this关键字专题之三:综合的通关面试题(难度相对稍高) 

下面的题是从360面试题里改造而来。是珠峰培训2014年第一期正式课第一天内容。视频也是课堂现场录的,没有经过处理和剪辑

视频地址:http://www.zhufengpeixun.com/kecheng/detail_477776

主要考试:作用域闭包、预解释和this关键字。把这个面试题拿下,以后再遇到作用域、闭包、this关键字的面试题也就不会有什么难度了。这是一道名副其实的通关题。对深入理解这三个基础知识点大有帮助!
注意一:下面面试题里有三个number要分清:
1、全局的number;2、obj的属性number;3、匿名方法运行的那个闭包里的number,下面19行。22行的number就是19行定义的number
注意二:this是谁,在函数定义时是不能确定的,运行的时候再知道呢!
注意三:变量值是什么,由在那儿定义决定。就说是变量是什么,由定义它的那个作用域决定的。
这些知识点都比较抽像,请通过视频认真理解
题目如下:
var number = 2;
var obj = {number : 4,
	fn1 : ( function() {		 
		this.number *= 2;
		number=number*2;//注意这是个坑,可以console.log(number)一下;
 		var number=3;//注意这儿的number是要被预解释的
			return function() {
				this.number *= 2;//this是谁,这会不知道,运行的时候再知道呢!
				number*=3;//number肯定是上一级作用域里的。既:变量值是什么,由在那儿定义决定。
				alert(number);//每次运行这个函数的时候,会弹出什么来
			}//这个匿名方法返回这个函数,fn1最终就是这个函数。
	} )()//这个匿名函数运行就是一个闭包
};

var fn1 = obj.fn1;//这儿只是给fn1赋值,对下面的alert(number)这行代码不会产生任何影响
//解释obj.fn1:这个属性就保存了匿名函数返回的那个函数的地址,则在20定义的这个函数就不能被销毁了,这个函数是在闭包里定义的。这个函数不能被销毁
alert(number);//问这会会弹出什么结果
fn1();//这会弹出什么结果 //
obj.fn1();//这次弹出什么结果9*3 number  27

alert(window.number); //这会window.number的结果是什么 
alert(obj.number);   //这会obj.number的结果是什么