一、作用域是什么?
含义:在JavaScript中,作用域为可访问变量,对象,函数的集合,它分为局部作用域和全局作用域。
如何理解:
函数和变量在哪些地方可以被访问 那些地方就是它的作用域。
作用域只有函数才有 代码块和对象的大括号没有作用域
函数外部称为外部作用域
函数内部称为内部作用域
js引擎规则:函数内部的代码可以访问内部的变量和函数 也可以访问外部的变量和函数
函数外部的代码 不能访问函数内部的变量和函数
函数和变量在函数内声明,变量为局部变量,函数为局部函数,都具有局部作用域。
局部变量或局部函数:只能在函数内部访问。
因为局部变量或局部函数只作用于函数内,所以不同的函数可以使用相同名称的变量和函数。
案例:
function fn (a) {
var a=300
a=100
function a(){}
}
var a=200;
fn(300)
console.log(a) //这里打印200,函数内部的变量a和函数a只作用于函数体内
三、JavaScript 全局作用域
变量或函数在函数外定义,即为全局变量或全局函数。
全局变量或全局函数有 全局作用域: 网页中所有脚本和函数均可使用。
如果变量在函数内没有声明(没有使用 var 关键字),该变量为全局变量。
案例:
function fn () {
a=100
}
var a=200;
fn(300)
console.log(a) //这里打印的就是100;因为函数体内的a没有用var声明也没有形参隐式声明,所以会找到外部的全局变量a然后修改
四、JavaScript 隐式提升
什么是隐式提升:
一个变量可以先使用在声明,因为每一个作用域在运行代码时,
会先扫描这个作用域代码中的所有var和function关键字 然后提前声明 再运行代码
比如:
console.log(a);//不会报错 因为隐式的提前声明了变量a,但是访问的值是undfined,因为变量只隐式提升声明
var a=100;
fn()//正常调用函数 因为隐式的提前声明了函数fn 函数的提升会把代码块一起提升
function fn(){}
隐式提升顺序是什么:
四个字:形实函运
解释:
1.先把函数内部的形参和局部变量提前声明
2.再把实参赋值给形参变量
3.然后再把内部的局部函数 提前声明
4.再按照代码顺序执行代码(执行的过程中 这个作用域内部有已经隐式提前声明的变量和函数就不再声明了
案例:
var a=100
function fn(a){ //在函数体内根据形实函运顺序,首先提前声明了 var a; 再实参赋值 a=100,
//然后提前声明函数 function a () {console.log(666666)} 注意这里函数不会运行,没有调用。
//最后再按照代码顺序执行。
console.log(a) // var a; a=100;function a () {console.log(666666)};放到了console.log(a)前面。
//这里优先级是依靠就近原则 所以这里打印 function a(){console.log(666666)}
a=10 // var a=10
console.log(a) // 打印10
var a=20 // var a=20
console.log(a) // 打印20
function a () {
console.log(666666)
}
console.log(a) // 打印20
}
fn(a)
console.log(a) //因为局部变量不会被函数外部访问所以,这里打印全局变量a; 打印100
五、函数调用 运行时的作用域
函数在声明和定义时就有了它的作用域 ,但是函数的调用可能发生在其他作用域,
运行代码时 一定是去它声明和定义的作用域执行代码
案例:
function fn(){
var a=10
return function fm(){console.log(a)}
}
var a=20
fn()() //fn()()解释:调用fn函数 运行后结果返回fm()函数 再次调用就是调用fm函数 打印变量a
/* 这里fm函数是fn函数的局部函数 ,虽然是在全局作用域调用运行fm函数,
但是fm函数定义的作用域在fn内部 因此执行代码的作用域在fn内部 */
//结果打印的不是全局变量a ,而是fn函数内部的a ;打印10
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)