作用域
作用域简单的理解就是:变量和函数可以访问到的范围。
作用域的范围分为两种:
- 全局作用域
- 局部作用域
全局作用域
全局作用域意指在代码块中任何地方都可以访问到的对象,那么这个对象就是全局作用域;
最外层函数之外声明的变量就是全局作用域的变量。
如下代码:
var a = 1;
function fn(){
console.log(a); //1
var b = 3;
function xx(){
var c = 3;
console.log(a); //1
}
xx();
console.log(c); //报错 c is not defined。
}
fn()
未使用var 声明的变量也拥有全局作用域;
function tt(){
cc = "haha";
function qq(){
b = "hello";
var non = 123123123;
console.log(cc); //haha
}
qq()
console.log(b) //hello
}
tt()
局部作用域
变量只在函数内部存在,外部无法访问。
function zxc(){
var a = 1;
}
zxc()
console.log(a) //a is not defined
作用域链
作用域链实质就是作用域之间搭建的一个桥梁。
但是,作用域链必须要记住的就是,外层作用域中的变量和函数可以被内层作用域所使用,但是内层作用域中的变量和函数外层是没有办法来直接访问的。
举个栗子:
var a = 1
function fn1(){
function fn3(){
function fn2(){
console.log(b)
}
var b = 5
fn2()
}
var a = 2
//console.log(b) //b is not defined
return fn3
}
var fn = fn1()
fn()
以上例子中,fn2如果找不到变量b,那么就会在他的外层fn3中去找变量b。
但是如果在fn3的外层找b是没有办法找到的,他只会往他的外层找,找到了就输出,找不到就报错。答案很显然找不到。
函数在执行的过程中,先从自己内部找变量,如果找不到,再从创建当前函数所在的作用域去找, 以此往上。
网友评论