1 //1.预解释毫无节操-自执行函数
2 f=function(){return true};
3 g=function(){return false};
4 (function(){
5 if(g()&&[]==![]){ //匿名函数中的g,即下面定义的方法g。 // []==![] 返回true
6 f=function(){return false;}
7 function g(){return true;}
8 }
9 })();
10 alert(f()); //false
11 alert(g()); //false
12
13
14
15 // 2.自执行函数的预解释
16 (function f(){
17 function f(){ return 1; }
18 alert (f()); //2
19 function f(){ return 2; }
20 })();
21
22
23
24 // 3.作用域链
25 var a=12;
26 function show(){
27 alert(a);
28 a=15;
29 }
30 show(); //12
31 alert(a); //15
32
33
34
35 // 4.预解释:变量声明早于代码运行
36 var a=12;
37 function show(){
38 alert(a);
39 var a=15;
40 }
41 show(); //undefined
42 alert(a); //12
43
44
45 // 5.预解释:变量声明早于代码运行
46 var uname = 'jack'
47 function change() {
48 alert(uname) //undefined
49 var uname = '三峰'
50 alert(uname) //'三峰'
51 }
52 change()
53
54
55 // 6.在没有形参的情况下:函数声明早于变量声明
56 function change() {
57 alert(typeof fn) // function
58 function fn() {
59 alert('hello')
60 }
61 var fn
62 }
63 change();
64
65
66 // 7.带var和不带var的区别;
67 function abc(){
68 a=12;
69 alert(a); //12
70 }
71 function b(){
72 alert(a) //12
73 }
74 abc();
75 b();
76
77 // 面试题
78 // 1.关于内存释放的面试题
79 function fn() {
80 var i = 10;
81 return function (n) {
82 console.log(n + (++i));
83 }
84 }
85 var f = fn(); //首先把fn执行,然后把执行的结果赋值给f,函数执行只要看函数里面有没有return
86 f(15); //26 //引用,执行完不会立即释放
87 f(20); //32
88 fn()(15); //26 //每次执行完内存释放,作用域销毁
89 fn()(15); //26
90 fn()(20); //31
91 fn()(30); //41
92 f(30); //43
93
94
95 // 2.综合面试题
96 // 考察:this指向
97 var num = 10;
98 var obj = {
99 num: 20,
100 fn: (function (num) {
101 this.num *= 2;
102 num += 10;
103 return function () {
104 this.num *= 3;
105 num += 1;
106 console.log(num);
107 }
108 })(num)
109 };
110 var fn = obj.fn;
111 fn(); //this->window 21
112 obj.fn(); //this->obj 22
113 console.log(window.num, obj.num); //60, 60
114 //https://zhidao.baidu.com/question/2270540468949188628.html
115 //http://www.imooc.com/qadetail/161604?t=227246
116 //https://www.zhihu.com/question/49789706
117
118
119 // 3.关于this和||的运用;
120 var name='三峰';
121 var age=500;
122 name=(function(name,age){
123 arguments[0]='三峰';
124 age=age||this.age;
125 console.log(name,age); //三峰 500
126 })(name);
127 console.log(name,age) // undefined 500
128
129
130 // 4.
131 var i=3;
132 function fn(){
133 i*=2;
134 return function(n){
135 console.log(n*(++i))
136 }
137 }
138 var f=fn();
139 f(3) //21
140 fn()(3); //45
141 f(4); //64
142 fn()(3); //99