美文网首页
Javascript作用域

Javascript作用域

作者: Anon_0507 | 来源:发表于2017-12-30 11:01 被阅读0次

js除了全局作用域之外,只有函数可以创建的作用域。所以,我们在声明变量时,全局代码要在代码前端声明,函数中要在函数体一开始就声明好。除了这里两个地方,其他地方都不要出现变量声明,而且建议使用“单var"形式。


image.png

如图,全局代码和fn、bar两个函数都会形成一个作用域。而且,作用域有上下级的关系,上下级关系的确定就要看函数是在那个作用域下创建的。作用域最大的用处就是隔离变量,不同作用域下同名变量不会有冲突。
作用域是在函数定义时就已经确定,而不是像执行上下文环境等到函数调用时才产生。而且,对函数不同的调用就会产生不同的上下文环境。
作用域只是一个“地盘”,一个抽象的概念,其中没有变量。要通过作用域对应的执行上下文环境来获取变量的值。同一个作用域下,不同的调用会产生不同的执行上下文环境,继而产生不同的变量的值。所以,作用域中变量的值是在执行过程中产生确定的,而作用域确实在函数创建时就确定了。如果要查找一个作用域下某个变量的值,就需要找到这个作用域对应的执行上下文环境,再在其中寻找变量的值。
自由变量:在某个作用域中使用的变量x,却没有在该作用域中声明(即在其他作用域中声明的),对于该作用域来说,x就是一个自由变量。

var x = 10;
function fn(){
var b = 20;
console.log(x+b); //x 就是一个自由变量。
}
无论如何,在fn中,x的取值要在创建fn函数的那个作用域中取值,是创建,而不是调用。如果在创建fn函数的那个作用域还没找到,则继续往上的作用域找,一直找到全局作用域,如果全局作用域都没找到,那就是没有了。这个一步步跨的路线,我们就称之为--作用域链。

相关文章

网友评论

      本文标题:Javascript作用域

      本文链接:https://www.haomeiwen.com/subject/wbyggxtx.html