1.变量最基本的作用域在函数体本身内部
例子:
'use strict';
function foo(){
var x=1;
x=x+1;
}
x=x+2; //这个写法会报错,因为无法在函数体外引用函数内部的变量
—-同理两个函数间的变量是相互独立的,互不干涉。
2.嵌套的函数,内部的函数能调用外部函数的变量,反之则不行。
function foo(){
var x=1;
function bar(){
var y=x+1; //2
}
var z=y+1; //这个会报错,外部函数不能访问内部的变量
}
3.内部变量屏蔽外部变量
如果在嵌套函数中,内部和外部的变量名存在重名的现象,内部变量会屏蔽外部变量,这是因为JS在读取函数时是由内而外的读取的,内部的变量优先级更高,所以会屏蔽外部的变量。虽然内部的函数会不调用外部的变量,但是不会改变外部变量的值,外部的变量还是可以被外部的函数所调用的。
use strict';
function foo(){
var x=1;
function bar(){
var x='A';
alert('in bar='+x); //'A'
}
alert('in foo='+x); //1
bar();
}
4.写JS函数时,要遵循‘函数内部首先申明变量的原则’
function foo(){
var x=1,y='a',z,i;
for(i=0;i<1;i++){
...
}
5.JS只有一个全局作用域,任何变量如没有在当前的作用域内找到,就会去上一层的作用域寻找,直到window的全局作用域内,如果到全局作用域内都找不到,就会报错。
6.局部作用域
由于函数的作用域是在函数体里面的,则函数的参数部分是不包括的,如for()。
function foo() {
for (var i=0; i<100; i++) {
//
}
i += 100; // 仍然可以引用变量i
}
为了解决这个问题,通常把for中的var
用let
来替换