js----作用域
作用域:
题目1:
<script> var s = 12; function f() { console.log(s); //undefined var s=12; console.log(s); //12 } f(); </script> ------------------------------ <script> var s = 12; function f() { console.log(s); //12 var t=12; console.log(s); //12 } f(); </script>
题目二
<script> function func() { console.log(num); //输出:undefined,而非报错,因为变量num在整个函数体内都是有定义的 var num = 1; //声明num 在整个函数体func内都有定义 console.log(num); //输出:1 } func(); </script> 相当于: <script> function func() { var num // 定义了num console.log(num); //输出:undefined,而非报错,因为变量num在整个函数体内都是有定义的 num = 1; //num 赋值 1 console.log(num); //输出:1 } func(); </script>
题目三
function bar() { function age() { console.log("1") } age() //2 function age(){ console.log("2") } age() //2 } result=bar();
题目四
<script> function bar(age) { console.log(age); //原因age在下面的函数声明了,当发现下面代码中声明了函数,function age(){},此时age别覆盖为函数代码 var age = 99; var sex= 'male'; console.log(age); function age() { //函数声明 alert(123) }; var age = function (){ // 属于函数表达式,赋值运算,和函数声明不一样 alert(123) } console.log(age); return 100; } result=bar(5); </script>
预解析:
<script> var fun = 1 function fun() { console.log("11") } fun() </script> 解释:为啥会报错,在预解析的时候,先var fun(var fun = 1 得来的),由于有函数声明,var fun = fun(){} 函数代码,结束预编译,当代码执行到var fun = 1 的时候,var fun 有被赋值了,所以 fun() 会报错,fun不是一个函数(相当于将函数调到最开头的地方)
例题:
<script> num = 1; function fun() { console.log(num) //1 } fun() console.log(num) //1 </script> =============================================== <script> fun() var num = 1; function fun() { console.log(num) //undefined } console.log(num) //1 </script> ============================================= <script> fun() num = 1; function fun() { console.log(num) //报错,原因是num = 1 并没有生成 var num 声明 num } console.log(num) //1 </script> 解释:如果在函数内部打印某个参数,首先从函数里面找,如果函数里面有定义了参数,如果参数在console.log()下面定义的,那个结果为undefined,否则,打印函数里面的参数值,如果函数里面 没有定义,则在调用函数的地方的局域里找,如果在调用函数的下面有定义,则结果为undefined,否则,为调用函数的地方上面定义的值,如果都没有,在出去找,一层一层 下面定义 结果为 undefined, 上面定义, 为 结果
<script> var a = 11 function abd() { console.log(a) //undefind var a = 1 } abd() </script> ============================== <script> var a = 11 function abd() { console.log(a) // 11 } abd() </script>
<script> a = "dd" var a console.log(a) //dd </script> =================================== <script> var a = "dd" var a console.log(a) //dd </script> ================================== <script> function fun(){ a = "dd" var a } fun() console.log(a) //报错 </script> ================================== <script> function fun(){ a = "dd" } fun() console.log(a) /dd </script>
<script> fun() console.log(a) //报错 console.log(b) //b=9 隐式全局变量 console.log(c) //c=9 function fun(){ var a = b =c = 9 //var a=9 b=c=9 console.log(a) console.log(b) console.log(c) } </script>
<script> f() var f = function () { console.log("1") } </script> //会报错,原因是这段代码相当 <script> var f f() //f不是一个函数 f = function () { console.log("1") } </script> ========================================= f() function f(){ console.log("此时不会报错") } 原因欲解析的时候 变成了这样 function f(){ console.log("此时不会报错") } f()