博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
javascript 作用域、作用域链理解
阅读量:6425 次
发布时间:2019-06-23

本文共 2081 字,大约阅读时间需要 6 分钟。

JavaScript作用域就是变量和函数的可访问范围。

1.变量作用域

   在JavaScript中,变量作用域分为全局作用域和局部作用域。

    全局作用域

      任何地方都可以定义拥有全局作用域的变量

      1.没有用var声明的变量(除去函数的参数)都具有全局作用域,成为全局变量,所以声明局部变量必须要用var

      2.window的所有属性都具有全局作用域

      3.最外层函数体外声明的变量也具有全局作用域 

var globalScope="globalScope";        function checkScope(){            var partScope="part";            scope="scope";        }        checkScope();        console.log(globalScope);//globalScope,全局变量        console.log(scope);        //scope,全局变量        console.log(partScope);//Uncaught ReferenceError: partScope is not defined,报错:没有定义partScope

    局部作用域

      1.函数体内用var声明的变量具有局部作用域,成为局部变量

      2.函数的参数也具有局部作用域   

var globalScope="globalScope";        function checkScope(x){            scope="scope"; //变成了全局变量            var partScope="part";//在函数体内,声明局部变量一定要加var            var globalScope="partScope";        }        checkScope(12);        console.log(globalScope);//globalScope,在函数体内,局部变量的优先级高于全局变量        console.log(scope);//scope,全局变量 console.log(partScope);        console.log(partScope);// Uncaught ReferenceError: partScope is not defined,局部变量外面访问不到        console.log(x);//局部变量外面访问不到

  总结:在函数体内局部变量的优先级高于同名的全局变量,声明局部变量必须用var

 2.函数作用域

 一些类C语言是块级作用域(block scope),每一个花括号是一个作用域,花括号内的代码对外是不可见的。而

JavaScript是函数作用域(function scope),没有块级作用域。无论函数体内的变量在什么地方声明,对整个函数都是可见的,即JavaScript函数里声明的所有变量都被提前到函数体的顶部,只是提前变量声明,变量的赋值还是保留在原位置

 函数作用域只能用函数来声明独立作用域,并不是每一个花括号都是一个独立作用域,例如:for循环并不能创建一个局部的作用域

for(var i=0;i<5;i++){            var scope='scope';        } console.log(i) //5;i仍然存在,因为JavaScript是函数作用域而不是块级作用域 console.log(scope);//scope;scope仍然存在 function checkScope(){            console.log(funScope); // undefined,函数里声明的所有变量都被提前到函数体的顶部,所以funScope才会认为已经存在            var funScope="funScope";        } checkScope();

 3.作用域链  

 作用域链:JavaScript的变量都是对象的属性,而该对象可能又是其它对象的属性,而所有的对象都是全局对象的属性,所以这些对象的关系可以看作是一条链, 

链头就是变量所处的对象,链尾就是全局对象

function checkScope(scope){              var funScope="funScope";     var s=scope; }

在查找变量funScope的值时,会先查找当前对象,如果当前对象查不到就继续查找作用域链上面的下一个对象,如果作用域链上没有一个对象包含此属性,就抛出引用错误。

在不包含嵌套的函数体内,作用域链上有两个对象:

 1.定义函数参数和局部变量的对象

 2.全局对象

在包含嵌套的函数体内,作用域链上至少有三个对象

 

转载于:https://www.cnblogs.com/greenteaone/p/4201309.html

你可能感兴趣的文章
Linux基础系列(四)Linux系统软链接硬链接知识
查看>>
jvm 调优参数
查看>>
Linux中find常见用法示例
查看>>
我眼中的苹果iphone
查看>>
discuz论坛安装异次元分享工具条的方法
查看>>
在Linux下用 eric4+python+pyqt 编写一个多窗口程序
查看>>
Java Annotation基础详解
查看>>
go语言学习-文件操作 path path/filepath
查看>>
DZX1.5加解密函数authcode分享
查看>>
Nginx Rewrite 规则
查看>>
我的朗科运维第四课(1)
查看>>
脱离 Spring 实现复杂嵌套事务,之八(MANDATORY - 要求存在事务)
查看>>
CentOS 配置Cacti监控整理
查看>>
我的友情链接
查看>>
邮件系统方案摘要
查看>>
爱若和布若
查看>>
newifi mini 刷 OpenWRT
查看>>
eclipse部署tigase源码
查看>>
mysql 5.6 主从复制配制
查看>>
iPhoneX隐藏状态栏
查看>>