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>
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。