var a = 5 // 声明一个全局变量
console.log(window.a) // 5
复制代码
javaScript的全局变量的做用域,顾名思义做用域就是全局,而函数的参数跟局部变量的做用域在函数体内。java
若是两个变量重名,一个变量是全局变量,一个是局部变量,优先级是 局部变量>全局变量bash
var a = 1 // 声明全局变量
function fuc() {
var a = 2 // 局部变量
return a
}
console.log(fuc()) // 2复制代码
若是在函数内声明变量没有带var,会被看成全局变量,也叫隐式声明函数
function fuc() {
var a = 2 // 局部变量
return a
}
console.log(a) // a is not defined复制代码
function fuc() {
a = 2 // 没有var,此时a是全局变量
return a
}
console.log(a) // 2复制代码
javaScript变量的做用域,与java等语言不一样的是,在变量声明的代码块以外是不可见的,简称“块级做用域”ui
function fuc(){
console.log(num) // 输出未定义的变量 会报错
}
fuc() // num is not defined复制代码
function fuc(){
console.log(num) // 不报错, 输出undefined,由于num在函数体内有定义
var num = 5
console.log(num) // 5
}
fuc()
//因为变量提高,上面代码等价于
function fuc(){
var num
console.log(num) // undefined
num = 5
console.log(num) // 5
}
fuc()
复制代码
javaScript的函数是容许嵌套的,就是在一个函数内部声明另外一个函数,代码以下spa
function A(){
var num = 5
function B() {
var b = 2
}
}
复制代码
执行A函数的时候,会建立A函数的做用域,B函数在建立的时候会引用A的做用域code
执行B函数的时候会引用函数A的做用域,由所谓的函数做用域的嵌套造成了函数做用域链。cdn
在自身若是找不到该变量的时候,就会沿着做用域向上查找,直至在全局做用域找不到时抛出错误对象
var a = 10
function aaa () {
alert(a) // 调用顺序3,内部没有a变量,沿着做用域链向上寻找,在找到全局变量a =10
}
function bbb () {
var a = 20
aaa() // 调用顺序2
}
bbb() // 调用顺序1 结果为10复制代码
function aaa(){
var a=b=10
}
aaa()
alert(a) // 报错
alert(b) // 10
//上面aaa()的代码等价于下面
var b = 10
function aaa() {
var a = b
}复制代码
function aaa () {
alert(a)
var a = 20
}
aaa() // undefined 此题与上面第二点的例子同样复制代码
var a = 10
function aaa () {
alert(a)
var a = 20
}
aaa() //结果为:undefined
//此代码等价于
var a = 10
function aaa () {
var a
alert(a) //undefined
a = 20
}
aaa() //结果为:undefined复制代码
var a = 10
function aaa (a) { // 函数传入形参 a
alert(a)
var a = 20
}
aaa(a) // 结果为: 10复制代码
var a = 1
var a // 这里的var a 是一个重复定义,变量只有定义后未赋值才会输出undefined,
这里JS引擎对重复定义的规定是:以最近的变量赋值做为变量在执行时的值
因此var a至关于无效
console.log(a) // 1
复制代码
var a=[1,2,3]
var b = a
b.push(4)
alert(a) // 结果为[1,2,3,4] 当b改变的时候a也发生了改变
当b从新被赋值的时候 a不会改变.示例:
var a = [1,2,3]
var b = a
b = [1,2,3,4]
alert(a) // 结果为 [1,2,3]
复制代码