<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如何解析函数的