1.作用域很简单,只是简单的点一下,js的作用域没有块级作用域,只有全局作用域与函数作用域;
例如:
if(true){
var a=100;
}
console.log(a);
在java或者c中大括号就是块外边是获取不到的,但是在js中是可以的,就相当于
var a;
if(true){
a=100;
}
这里的a就是全局作用域;凡是在函数外定义的变量都是全局作用域。
特例:
function Loga(){
a=100
}
console.log(a);
这里的a也是可以获取到的,当在函数内部不带var 就直接声明变量时也是把父作用域当作作用域,但是不建议这么写,一般需要声明定义。
对于函数作用域通过字面理解就是定义在函数内部的变量就是在函数内部起作用;
函数作用域与全局作用域的区别是,函数作用域内可以调用全局作用域的变量并进行修改,但是全局作用域不能调用函数作用域内定义的变量,这里定义很关键(是不是修改),这里涉及到作用域链,就是变量依次可以访问父级作用域的变量,通俗讲就是从内向外可以访问但是从外向内是不可以访问的。
2.闭包
闭包的概念没有一个确切的说法,下面来说一下闭包的使用场景
扫描二维码关注公众号,回复:
1792359 查看本文章
a.函数作为返回值;
b.函数作为参数传递
例子:
function F1(){
var a=100
return function(){
console.log(a);//a是自由变量
}
}
var a=200;
var f=F1();
f();
这是一个典型的闭包案例,返回值f为一个函数,执行环境是全局,但是生成环境是在F1中,这里函数的作用域就是F1,所以输出就是100;这里的a是自由变量,要去父作用域查找,就是F1.
第二中情况,函数作为参数传递
function F1(){
var a=100
return function(){
console.log(a);
}
}
var a=200;
var f=F1();
function F2(fn){
var a=300;
fn();
}
F2(f);
很显然结果是一样的,理由同上,执行环境是F2,但是生成环境是F1,父作用域是F1,所以输出仍为100.