var test = 5; //全局函数 任何地方都可使用 ,不管函数内还是函数外
function a() {
var a = 3; //局部变量 只能在函数内使用,不能在函数外
console.log(a); //3
console.log(test);//5
}
a();
console.log(a); //无法找到变量a 因为他是函数体内的局部变量,
console.log(test);//5
var test = 5;
function a() {
a = 3; //全局变量 因为没有var 所以无论在函数体内或外都能访问的到
console.log(a); //3
console.log(test); //5
}
a();
console.log(a); //3
console.log(test); //5
var test = 5;
function a() {
var test = 3; //局部变量虽然名与全局变量相同,互补影响
console.log(test); //3
/*
因为在最外层的变量,会被作为window的属性,
这时候就算函数内部声明了相同的变量,
还是可通过window对象找到外部定义的变量,这就有了全局变量的功能。
*/
console.log(window.test); //5
}
a();
console.log(test); //5
变量可以分为全局变量和局部变量(或称私有变量)
全局变量在整个页面中可见,并在页面任何位置被允许访问。
局部变量只能在指定函数内可见,函数外面是不可见的,也不允许访问。
在函数内部使用var关键字声明的变量就是私有变量,该变量的作用域仅限于当前函数体内。
但是如果不使用var关键字定义的变量都是全局变量,不管是在函数内或者函数外,在整个页面脚本中都是可见的。
var str1="hellow1"; //定义一个全局变量
str2="hellow2"; //定义一个全局变量
window.str3="hellow3"; //定义一个全局变量
function func(){
var str4="hellow4";//定义一个局部变量
str5="hellow5"; //定义一个全局变量
}
Javascript总是在不知不觉中就出人意料地创建了全局变量。就像:
function func(){
var a = b = 0;
//. . .
}
本想定义两个局部变量,但是代码却是 a 是局部变量,b 是全局变量。这是由于操作符的优先级是从右到左的,就像。
var a = ( b = 0 );
如果对链式赋值所有变量都进行了声明,就不会创建出不期待的全局变量。
var a, b;
a = b = 0;
全局变量的值存储在window中,通过window.a可以拿到变量a的值,而之前直接console.log(a);也可以拿到变量a的值,是因为console.log(a);是从window上拿的,由此可以知道,window.a === a。
var a = 123;
console.log(window.a == a);//true
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
局部变量
局部变量一般定义在函数当中,
变量b只存储在test函数中,在函数test中访问变量b,是完全可以访问到的。
如果是在test函数外面去访问test函数里面的变量b,是访问不到的,而且会报错,因为在全局中并没有定义变量b,直接访问没有被定义的变量b是会报错的。
function test() {
var b = 123; //局部变量
console.log(b); //123
}
test();
console.log(b);//报错
如果在test函数中访问全局的变量是可以访问的,
var a = "aaa";
function test() {
var b = 123; //局部变量
console.log(b); //123
console.log(a);//aaa
}
test();
console.log(b); //报错
1、js变量分为全局变量和局部变量,全局变量不能访问局部变量,局部变量可以访问全局变量。
2、彼此独立的函数,只能访问自己函数里的变量和全局变量,不能访问别人函数里的变量。
3、全局变量与局部变量之间会形成各自的作用域
function test() {
var b = 123; //局部变量
console.log(b); //123
}
function index() {
console.log(b);//访问不到test函数中的变量b 报错
}
test();
index();
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
变量名的优先级(当有多个名字重复的变量时候)
局部变量高于同名全局变量;
参数变量高于同名全局变量;
局部变量高于同名参数变量;
- 函数体内部,局部变量的优先级比同名的全局变量高。
-未使用var关键字定义的变量都是全局变量。
-全局变量都是window对象的属性