作用域闭包、变量预解释和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的结果是什么