javascript 作用域、作用域链理解

简介:

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.全局对象

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

 

作者:绿茶叶 
出处:http://www.cnblogs.com/greenteaone/ 
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

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

目录
相关文章
|
JavaScript 前端开发
js的作用域作用域链
【10月更文挑战第29天】理解JavaScript的作用域和作用域链对于正确理解变量的访问和生命周期、避免变量命名冲突以及编写高质量的JavaScript代码都具有重要意义。在实际开发中,需要合理地利用作用域和作用域链来组织代码结构,提高代码的可读性和可维护性。
|
JavaScript 前端开发
浅谈js作用域
浅谈js作用域
165 0
|
前端开发 JavaScript 数据处理
CSS 变量的作用域和 JavaScript 变量的作用域有什么不同?
【10月更文挑战第28天】CSS变量和JavaScript变量虽然都有各自的作用域概念,但由于它们所属的语言和应用场景不同,其作用域的定义、范围、覆盖规则以及与其他语言特性的交互方式等方面都存在明显的差异。理解这些差异有助于更好地在Web开发中分别运用它们来实现预期的页面效果和功能逻辑。
221 11
|
JavaScript 前端开发
javascript的作用域
【10月更文挑战第19天javascript的作用域
|
JavaScript 前端开发
如何在 JavaScript 中实现块级作用域?
【10月更文挑战第29天】通过使用 `let`、`const` 关键字、立即执行函数表达式以及模块模式等方法,可以在JavaScript中有效地实现块级作用域,更好地控制变量的生命周期和访问权限,提高代码的可维护性和可读性。
|
JavaScript 前端开发
JavaScript 作用域
JavaScript 作用域是指程序中可访问的变量、对象和函数的集合。它分为函数作用域和局部作用域。函数作用域内的变量仅在函数内部可见,而全局作用域的变量在整个网页中均可访问。局部变量在函数执行完毕后会被销毁,而全局变量则在整个脚本生命周期中都存在。未使用 `var` 关键字声明的变量默认为全局变量。
|
JavaScript 前端开发
JavaScript基础知识-作用域(action scope)
关于JavaScript基础知识中作用域的介绍。
199 1
JavaScript基础知识-作用域(action scope)
|
JavaScript 前端开发
js作用域
js作用域
119 1
|
JavaScript 前端开发
js 变量作用域与解构赋值| 22
js 变量作用域与解构赋值| 22
|
缓存 JavaScript 前端开发
了解js基础知识中的作用域和闭包以及闭包的一些应用场景,浅析函数柯里化
该文章详细讲解了JavaScript中的作用域、闭包概念及其应用场景,并简要分析了函数柯里化的使用。
了解js基础知识中的作用域和闭包以及闭包的一些应用场景,浅析函数柯里化