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()

浙公网安备 33010602011771号