关于变量提升的一些事~

关于变量提升的一些事~

最近在看一些变量的东西,可能对js的变量提升有些诧异,所以就来写一写~~~~

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210

function Foo() {
sayMyName = function() {
console.log('july')
};
};
sayMyName();
var sayMyName = function() {
console.log('july1');
}
sayMyName();
function sayMyName() {
console.log('july2');
}
sayMyName();
Foo();
sayMyName();
//模拟
function Foo() {
sayMyName = function() {
console.log('july')
};
};
function sayMyName() { //因为同名函数和变量,同名函数会提升,同名变量不会提升。
console.log('july2');
}
sayMyName(); //所以这里打印的是'july2';
var sayMyName = function() {
console.log('july1');
}
sayMyName(); //执行到这里,因为上面又覆盖了,所以打印的是'july1';
Foo();//因为执行了FOO()的函数,所以相当于把sayMyName函数重新定义
sayMyName(); //所以打印的是'july'

---
var a = 10;
function f1() {
var a = 10;
console.log(a);
}
f1();
console.log(a);

//模拟
var a; //在预解析的时候,变量和函数会提升到作用域的顶层。
function f1() {
var a;
console.log(a);
a = 20;
}
a = 10;
f1(); //当我们执行调用f1函数的时候因为变量会提升到函数作用域的顶层,所以打印的是undefined;
console.log(a); //因为函数里的变量是局部变量所以不会影响到全局变量,所以这里打印的还是10;

function f1() {
console.log(1);
}

console.log(f1); //同名函数和同名变量的时候,变量不会提升,所以打印的是f1函数体

var f1 = "july"; //当我们执行到这里的时候,我们又把函数覆盖成了一个变量.
console.log(f1);//所以这里打印的是"july"

---

var a = "july";
foo();

function foo() {
console.log(a);
var a = "JESSICA";
console.log(a);
}

//模拟
var a; //预解析的时候,变量和函数提升到作用域的顶层。
function foo() {
var a; //变量提升到函数作用域的顶层。
console.log(a); //所以这里打印的是undefined;
a= "JESSICA"; //执行到这行的时候又给a赋值了'JESSICA';
console.log(a);//所以这里是'JEESICA'
}
a ='july';
foo(); //调用函数

---
function foo() {
if ('a' in window) {
var a = 10;
}
console.log(a);
}
foo();

//模拟
function foo() {
var a; //变量提升到函数顶层。
if ('a' in window) { //因为变量a是声明在函数作用域里,所以不在window。所以为false;'
a = 10;
}
console.log(a); //所以这里执行的是undefined;
}
foo(); //调用函数

---

if ('a' in window) {
var a = 10;
}
console.log(a);

var a; //js里除了函数作用域其他都是全局作用域。
if ('a' in window) {//所以a在window里,所以是true
a = 10; //a赋值为10
}
console.log(a); //所以打印的是10

if (!'a' in window) {
var a = 10;
}
console.log(a);

//模拟
var a; //js里除了函数作用域其他都是全局作用域。
if (!'a' in window) { //变量a不在window里,所以是false
a = 10;
}
console.log(a); //所以打印的是undefined

---

var foo = 1;
function Foo() {
if(!foo) {
var foo = 10;
}
console.log(foo);
}
Foo();

//模拟
var foo;
function Foo() {
var foo; //变量提升到函数作用域顶层。
if(!foo) { //因为是去反,上面的undefined为假去反就是真,为true
foo = 10; //给foo赋值为10
}
console.log(foo); //打印为10
}
foo = 1;
Foo();

---

function Foo() {
sayMyName = function(){
console.log("1");
};
return this;
}
Foo.sayMyName = function() {
console.log("2");
};
Foo.prototype.sayMyName = function(){
console.log("3");
};
var sayMyName = function() {
console.log("4");
};
function sayMyName(){
console.log("5");
}
Foo.sayMyName();
sayMyName();
Foo().sayMyName();
sayMyName();
new Foo.sayMyName()
new Foo().sayMyName();
new new Foo().sayMyName();


//模拟
function Foo() {
sayMyName = function(){
console.log("1");
};
return this;
}
Foo.sayMyName = function() {
console.log("2");
};
Foo.prototype.sayMyName = function(){
console.log("3");
};
function sayMyName(){ //同名函数和同名变量情况下,函数提升。
console.log("5");
}
var sayMyName = function() {
console.log("4");
};
Foo.sayMyName(); //这里说的是函数的静态方法,所以打印的是2;
sayMyName(); //这里执行的是调用sayMYname的函数所以是4;
Foo().sayMyName(); //调用FOO函数,重新定义了sayMyName函数,所以打印的是'1'
sayMyName();//因为上面调用FOO函数,重新定义了函数,所以还是'1';
new Foo.sayMyName()//打印的是函数的静态方法也是2,new 2 == 2,前面的new无意义。
new Foo().sayMyName();//这里是new了个新对象,所以指向的是原型对象上的sayMyName方法,所以打印的是'3'
new new Foo().sayMyName();//等同于上面,只不过new 3 == 3,无意义。

---

文章目录
,
//