1.变量作用域
变量的作用域:全局变量和局部变量。
在JavaScript中:函数内部可以直接读取全局变量,但是在函数外部无法读取函数内部的局部变量。注意:在函数内部声明变量时,要使用var命令。如果不用,实际上声明的是一个全局变量!
2.全局作用域链
先看一个例子:
var a = 123;
fn(a);
function fn(a){
a = 456;
}
console.log(a); //123
运行过程分析:
1.声明变量a,并且赋值a=123;
2.将a传递到fn(a)并且执行function,在function内的a赋值为456;
3.输出a的值为123。
原理解释:
var a = 123,是在全局作用域下声明的,与局部变量中的a并非同一个变量,function fn(a){ }中的a相当于声明了在局部作用域中的一个变量a,外部环境实际上是无法直接访问内部声明的变量a的,所以位于全局作用域下的console.log(a)会去找全局作用域下声明的a,即a = 123 ,所以最后输出值为123。
执行逻辑:
每当执行一个函数,就进入了一个新的作用域下,找变量先从自己的作用域下找,如果找不到就到上一层(当前函数声明的作用域)的作用域下寻找,直到找到为止。(如果在全局作用域下仍未找到,就是undefined)
3.闭包的概念
function f1(){
var n=999;
function f2(){
alert(n); // 999
}
}
代码中的f2函数,就是闭包。
闭包就是能够读取其他函数内部变量的函数。例如在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。(闭包就是能够读取其他函数内部变量的函数。)
4.函数的参数传递
function inc(n){
n++;
}
var a = 10;
inc(a);
console.log(a) //10
上面代码相当于:
function inc(n){
var n = arguments[0];
n++;
}
var a = 10;
inc(a);
console.log(a) //10
执行步骤:
声明一个变量n,值为arguments[0],inc(a)即是将a的值传递给arguments,即function inc(){}里面的n = 10,n++,但是与a的值并无关联,所以a的值并未改变,仍然是10。