<script> /* js是函数级作用域,在函数内部的变量,内部都能访问, 外部不能访问内部的,但是内部可以访问外部的变量 闭包就是拿到本不该属于他的东西,闭包会造成内存泄漏,你不知道什么时候会用这个闭包,然后这个资源会一直占据内存,造成内存泄漏 */ /*1 --函数内部可以访问外部的变量*/ /*var i = 10; function test() { console.log(i); } test();*/ /*2 在函数外部,我们就不能访问函数内部的变量,不然会报变量没有被定义*/ /*function test() { var j = 20; } console.log(j);*/ //test.html:19 Uncaught ReferenceError: j is not defined /*3 函数的嵌套--这个a函数就能访问test函数的j变量*/ /*function test() { var j = 5; function a() { console.log(j); } a(); } test();*/ //5 /*4*/ /* function test() { if(false) { var i = 5; } else { j = 10; } //i--undefined 是没有被赋值而已 j--10 //test.html:42 Uncaught ReferenceError: k is not defined 这就是没有定义--报错 console.log(i+"-->"+j +"-->"+k); } test();*/ /*5 -- 这里 在执行的过程中,会将test()这个函数前置,但是在调用它的时候却不会找到j,因为j是在后面定义的*/ /*test(); //undefined var j = 10 function test() { console.log(j); }*/ /*6*/ /*test(); //返回 undefined var k = 200; function test() { console.log(k); }*/ /*7*/ /* var k; test(); //undefined k = 200; function test() { console.log(k); } */ /*其实例子6和7是一个意思,都是变量定义了,但是没被赋值,执行test()的时候,都返回undefined*/ /*9面试题:函数前面加一个波浪线*/ /*var j = 100; ~(function() { console.log(j); })(); //返回100 */ /*10 函数前面没有波浪线的情况*/ /*var k = 5; (function() { console.log(j); })();*/ //返回 --》test.html:89 Uncaught ReferenceError: j is not defined //函数前面加波浪线,此时会将函数转化为一个表达式 输出 所以这个波浪线很重要 /*11面试题:*/ /*var i = 10; function test() { console.log(i); var i; } test(); */ // 返回undefined 这里的后面的var i;这条语句会被前置,然后会将外面的全局变量i给覆盖掉,此时这里面的i又没有被赋值,所以,执行test()会返回undefined; 下面12的例子说明这个问题 /*12*/ /*var j = 20; function test() { var j; console.log(j); j = 5; } test(); *///返回undefined 和11是一样的,这里在函数内部定义了j 直接把外部的j给覆盖掉了,然后赋值操作又在console语句的后面,所以会出现undefined /*---------------------------分割线----------------------*/ /*13 --这里就是闭包 将我们函数里面的内容用函数的方式返回出去*/ /*function test() { var j = 5; return function() { return j; } } var t = test()(); console.log(t);*/ </script>
深入理解Js的执行过程很重要
这里有,js如何解析函数的
时间: 2024-11-13 19:17:13