js作用域和作用链

js中函数嵌套是非常普遍的,那么子啊函数嵌套中,变量时怎么寻找的?

答:首先在内层中寻找,找不到的话就跑的外层寻找,

……直到跑到window顶层(全局)为止

——————————————————————————————

声明变量时加var和不加var的区别,

答:加var才是声明变量。不加的话是赋值操作(不要狭隘的理解为声明了一个全局变量),会在函数内部找变量,找不到往上层找,还没有的话找到window,并赋值。

  js中 允许在定义变量的时候 不加var 修饰符。
-》不加var 修饰符。js会在当前作用域下寻找上下文是否定义了此变量, 如果没有找到则会为这个变量分配内存。当且将其视为window的成员。 也就是全局变量。
-》如果加了var 修饰符。 js会重新为这个变量分配内存,不论当前上下文中是否已经定义过了。这个变量的作用域就为当前上下文。 即局部变量。

 1 <script type="text/javascript">
 2 
 3 function t1() {
 4     var d;
 5 
 6     function t2() {
 7         d = 5;
 8         e = 6;
 9     }
10 
11     t2();
12 }
13 
14 
15 t1();
16 
17 console.log(e); // 6
18 console.log(d); // d is not defined错误
19 console.log(window.d); // undefined
20 
21 /*
22 注意:
23 以window.xxx引用全局变量,寻找不到,做为某个属性不存在,返回undefined
24 直接以xxx引用某命题,寻找不到,则是报xxx is not defined错误
25 */
 1 <script type="text/javascript">
 2 
 3 /*
 4 作用域考试
 5 
 6 注:这是一个极容易出错,又极基础的JS面试题
 7 */
 8 
 9 
10 /*
11 var str1 = 'global';
12 
13 function  t1() {
14     console.log(str1);
15     console.log(str2);
16 
17     str2 = 'local';
18 }
19 
20 t1();  
21 
22 
23 
24 常见的3种答案
25 global , local
26 global , undefined
27 global , str2 is not defined错误
28 
29 分析: 
30 
31 19行执行, 在t1内寻找str1--没有,又在window上寻找str1,有. 打印global
32 20行执行, 在t1内寻找str2--没有,又在window上寻找str2,没有. 报str2 is not defined错误
33 22行: (实际上出错,没执行到这一些)  才把全局的str2变量赋上值
34 */
35 
36 
37 var str1 = 'global';
38 
39 function  t1() {
40     console.log(str1);
41     console.log(str2);
42 
43     var str2 = 'local';
44 }
45 
46 t1();   // global undefined
47 
48 /*
49 解释:
50 
51 js代码自上而下执行!
52 
53 但是----------
54 js代码在整体运行分:
55 
56 词法分析期
57 运行期
58 
59 自上而下执行之前 , 先有一个"词法分析过程"!
60 
61 
62 此上面的结果为例:
63 
64 
65 1步:分析t1函数
66 
67 t1{
68 var str2    // 分析出 t1内有str2局部变量. 注意此时函数未执行,因此str2的值是undefined
69 }
70 
71 2步: 执行t1函数
72     console.log(str1);   // global
73     console.log(str2);   // undefined
74     str2 = 'local';  // 此时,str2的值为local
75 
76 */
77 
78 
79 /*
80 
81 词法分析是我们的一个重点
82 
83 */
84 
85 
86 
87 
88 </script>
原文地址:https://www.cnblogs.com/a2762/p/4119633.html