一、什么是作用域?
作用域: 指一个变量它在哪些代码范围能够被使用,这些地方就是变量的作用域
// 变量的作用域(入门)
var a=20
function fn(a){
//隐式代码 var a=10
console.log(a) //10
}
fn(10)
var b=30
function fn(){
var a=20
console.log(a)//20
console.log(b)//30
}
fn()
var a=30
function fn(){
var a=20
console.log(a) //20
}
fn()
console.log(a) //30
二、变量的作用域
- 在es5中 函数的代码块内部的代码 可以访问形参变量 也可以访问外部的变量(全局) 就近优先
- 函数外面的代码不能直接访问函数内部的变量
- 全局变量==>变量会在程序运行时 把它设置为window对象的属性
var a=20//全局变量==>变量会在程序运行时 把它设置为window对象的属性
function fn(){
a=40
}
fn()
console.log(a) //40
function fm(){
a=60
}
fm()
console.log(a)//60
a=100
console.log(a) //100
- 局部变量就是函数内部能使用 外部不能使用的变量( var,形参)
function fn(a) {
var b = 20
console.log(a, b) //100,20
}
fn(100)
console.log(a) //a没有定义,报错
console.log(b) //b没有定义,报错
案例
题1:
var obj={
name:"karen"
}
function fn(n){
//隐式代码: var n="karen"
n="jack"
}
fn(obj.name)
console.log(obj.name)//
答案:karen
解析: fn(obj.name) ,将obj.name取值然后再传入函数,在函数内部隐式声明变量n,赋值为karen,后将n的值改为jack
题2:
var obj={
name:"karen"
}
function fn(n){
n.name="jack"
}
fn(obj)
console.log(obj.name)//
答案:jack
解析:obj是一个对象,fn(obj),obj取值操作取的是一个引用的对象,在函数内部隐式操作 var n=内存中的那个传入的对象,n和obj共用一个内存空间, n.name=“jack” ,其实没有修改n的值,修改了n对应的内存空间里的name属性的值,所以obj.name也改变了。
题3:
var obj={
name:"karen"
}
function fn(n){
//隐式操作 var n=内存中的数那个传入的对象
// n={name:"jack"}//把n的值改了
}
fn(obj)//obj取值操作 取的是一个引用的对象
console.log(obj.name)//
答案:karen
解析:跟上一题的分析相同,只不过此题的n被重新指向新的一个内存空间了,而obj.name的值没有被改变。
总结
变量的作用域很重要,后面会更着重的讲一遍,要掌握函数外部不可以访问函数内部的变量,函数内部可以访问和改变外部的全局变量。函数会提前隐式声明变量。