作用域是指一个变量的作用的范围
在JS中一共有两种作用域:
1、全局作用域
-- 直接编写在script标签中的js代码,都在全局作用域中
-- 全局作用域在页面打开时创建,在页面关闭时销毁
-- 在全局作用域中有一个全局对象window
它代表的是一个浏览器的窗口,它由浏览器创建,可以直接使用
-- 在全局作用域中:
创建的变量都会作为window对象的属性保存
创建的函数都会作为window对象的方法保存
-- 全局作用域的变量都是全局变量,在页面的任意部分都可以访问
2、函数作用域
-- 调用函数创建函数作用域,函数执行完毕以后,函数作用域销毁
-- 每调用一次函数就会创建一个新的函数作用域,他们之间是相互独立的
-- 在函数作用域中可以访问到全局作用域的变量
-- 相反,在全局作用域中无法访问到函数作用域的变量
就近原则:
当函数作用域操作一个变量时,它会先在自身作用域中寻找,如果有就直接使用,如果没有 则向上一级作用域中寻找,直到找到全局作用域,如果全局作用域中仍然没有找到,则会报错(ReferenceError)
若想直接找全局作用域的变量,可以使用window.变量
var a = 123
function fun(){
alert(a); //a从全局中找
}
fun(); //返回123
var a = 123
function fun(){
alert(a); //有var,函数中的alert(a)从函数中找,a未undefined
var a = 456;
}
fun();
alert(a); //全局的alert(a)从全局中找,为123
/
var a = 123
function fun(){
console.log(a) //从全局中找,为123
a=456 //没有var a,此时是对全局a的重新赋值
}
fun()
console.log(a) //全局a已被重新赋值为456,则控制套输出为456
/
var a = 123
function fun(a){ //有形参
console.log(a) //此时a为形参a,没有赋值则为undefined
a=456 //为函数中的a赋值,即给形参a赋值为456,但全局a没有改变
}
fun() //没有传实参
console.log(a) //仍为123
/
var a = 123
function fun(a){ //有形参,实参123赋值给形参a
console.log(a) //此时a为形参a,有赋值则为123
a=456 //为函数中的a赋值,即给形参a赋值为456,但全局a没有改变
}
fun(a) //传实参
console.log(a) //仍为123
this关键字:
-- 解析器在调用函数每次都会向函数内部传递一个隐含的参数,这个隐含的参数就是this
-- this指向的是一个对象,该对象称为函数执行的上下文对象,根据函数的调用方式不同,this会指向不同的对象
- 函数调用方式,this永远为window(函数为window的方法)
- 以方法形式调用,this为该方法的对象
- 也就是,谁把函数调用了,this就指向谁(即this为当前的这个对象)