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

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索函数
, 局部变量
, 变量
, 全局变量
, 函数作用域
, 作用域链
, 作用域
, 全局
, repositionbars的作用
, 局部变量onclickandroid
, #局部变量
, scope
, 作用
局部
javascript作用域链、javascript的作用域链、javascript作用域、javascript变量作用域、javascript的作用域,以便于您获取更多的相关知识。

时间: 2024-12-31 02:46:28

javascript 作用域、作用域链理解的相关文章

浅析JavaScript中作用域和作用域链_javascript技巧

学习js,肯定要学习作用域,js作用域和其他的主流语言的作用域还存在很大的区别. 一.js没有块级作用域. js没有块级作用域,就像这样: if(){ var a = 100: console.log(a) //输出100 } console.log(a) //输出100 js中像if,for,switch之类的语句,他们包含的代码块里面的变量,在代码块外面也能被读取,所以说,js没有块级作用域. 二.js的全局变量 js中规定,全局变量都可以看作是window的属性,而且全局变量能够被所有的代

理解JavaScript变量作用域更轻松_javascript技巧

JavaScript本身作为一门简单的语言,就其变量作用域问题一样令不少人头晕,这主要是因为JavaScript闭包的存在.本文不打算深入讲解JavaScript变量作用域问题(其实本人也没有能力能把这一话题讲的深入些),也不讲"闭包"话题,本文只讨论最实用的JavaScript作用域知识点. 一.JavaScript作用域分类 JavaScript就两种作用域:全局(window).函数级(function).函数级(function)不要理解为"块级(大括号{}级)&qu

JavaScript的作用域和块级作用域概念理解

  作用域永远都是任何一门编程语言中的重中之重,因为它控制着变量与参数的可见性与生命周期.讲到这里,首先理解两个概念:块级作用域与函数作用域. 什么是块级作用域呢? 任何一对花括号({和})中的语句集都属于一个块,在这之中定义的所有变量在代码块外都是不可见的,我们称之为块级作用域. 函数作用域就好理解了(*^__^*) ,定义在函数中的参数和变量在函数外部是不可见的. 大多数类C语言都拥有块级作用域,JS却没有.请看下文demo: //C语言 #include void main() { int

轻松5句话解决JavaScript的作用域_javascript技巧

javascript 程序的每一个字节都是在这个或那个运行上下文(execution context)中执行的.你可以把这些上下文想象为代码的邻居,它们可以给每一行代码指明:从何处来,朋友和邻居又是谁.没错,这是很重要的信息,因为 javascript社会有相当严格的规则,规定谁可以跟谁交往.运行上下文则是有大门把守的社区而非其内开放的小门. 我们通常可以把这些社会边界称为作用域,并且有充足的重要性在每一位邻居的宪章里立法,而这个宪章就是我们要说的上下文的作用域链(scope chain).在特

javascript 词法作用域和闭包分析说明_javascript技巧

复制代码 代码如下: var classA = function(){ this.prop1 = 1; } classA.prototype.func1 = function(){ var that = this, var1 = 2; function a(){ return function(){ alert(var1); alert(this.prop1); }.apply(that); }; a(); } var objA = new ClassA(); objA.func1(); 大家应

网易JS面试题与Javascript词法作用域说明_javascript技巧

调用对象位于作用域链的前端,局部变量(在函数内部用var声明的变量).函数参数及Arguments对象都在函数内的作用域中--这意味着它们隐藏了作用域链更上层的任何同名的属性. 2010年9月14日,我去参加网易网页工程师招聘会,应聘JS工程师职位.有幸参加笔试,然后有幸栽在笔试,呵呵.废话少说,抓出音响极深的一题重新研究研究. 题目大概是:写出如下代码的输出结果并进行分析 复制代码 代码如下: var tt = 'aa'; function test(){ alert(tt); var tt

一道关于JavaScript变量作用域的面试题_javascript技巧

小编觉得这道题对理解JavaScript 作用域还是很有帮助的,特此又把自己的解题思路梳理了一遍,希望对其它人有所帮助. 首先看下面试题: var arr = [1, 2, 3]; for (var i = 0, j; j = arr[i++];) { console.log(j); } console.log('---------'); console.log(i); console.log('---------'); console.log(j); console.log('--------

Javascript的作用域的学习笔记

前言:之前看过一句话说,如果不能把所学知识向一个人解析清楚,说明其实自己也没弄懂.  代码如下 复制代码 先上三段说明作用域的代码 //==========例1==========   var scope='global'; function fn(){     alert(scope);     var scope='local';     alert(scope); } fn();        //输出结果? alert(scope);//输出结果?   //===========例2==

javascript作用域: JavaScript的作用域

/***************************************  *其结果是打印出global  ****************************************/  var a = 'global';  ( test(){  write(a);  })();  /***************************************  *其结果是打印出undefined  ****************************************