JavaScript基础概念之----作用域链

也称:词法作用域

JavaScript查找变量关联的值时,会遵循一个查找链,这个链是基于作用域的层次结构的。

var a = ‘hello‘;

var func1 = function(){
    var func2 = function(){
        console.log(a);
    }
}

//hello

如上图,查找过程如下:

1、在func2函数中查找变量a,如果找到了,直接输出值,如果没有找到,转到第2步

2、在func2的父函数 func1函数中继续查找,如果找到了,直接输出值,如果没有找到,转到第3步

3、继续在全局作用域中查找,如果找到了,直接输出值,如果没有找到,输出undefined

作用域链查找 返回第一轮值。当在作用域链内最近位置查到变量时,查找即结束,不管作用域链顶部是否还有相同的变量名称

var a = 1;
var func1 = function(){
    var a = 2;
    var func2 = function(){
        var a = 3;
        console.log(a);//输出 3。局部变量a在作用域内是第一个被查找到的,因此不再查找其余的
    }
}

作用域链 是根据函数定义时的位置决定的,而不是在调用时确定的。

正因为 作用域链是在函数调用之前创建,所以才可以创建闭包。

原文地址:https://www.cnblogs.com/adhehe/p/9785019.html

时间: 2024-07-30 16:32:55

JavaScript基础概念之----作用域链的相关文章

JavaScript基础概念之----作用域

1.在JS中,作用域就是指 执行代码的上下文. 2.有三种类型的作用域: 全局作用域 局部作用域(也称为"函数作用域") eval作用域 3.在全局作用域中定义的变量,从任何地方都可以访问,因为它是作用域链中最高层(最后一个).它的生命周期将跨越整个程序.在JavaScript中没有使用 var 关键字声明的变量都是全局变量. 4.在函数内部使用 var 定义的变量,其作用域是局部作用域,局部作用域 只对该函数的其他表达式是"可见的",包括嵌套/子函数中的代码.函数

js基础--javascript基础概念之变量与作用域

js基础--javascript基础概念之变量.作用域 javascript按照ECMA-262 的定义,变量与其他语言变量有所不同.js变量时松散的,不需要事先定义变量类型的.这使得他只是一个保存特定值的一个名称.变量与其数据类型可以在脚本的生命周期内改变. 还有明白几点: JavaScript的变量作用域是基于其特有的作用域链的,JavaScript没有块级作用域. 基本类型和引用类型的值 ECMAScript 的变量有两种不同的数据类型:分别是 基本数据类型值 和 引用类型值 : 基本数据

js基础--javascript基础概念之语法

掌握一门语言 必须先掌握它的语法! javascript 的语法和C.Java.Perl 的语法有些相似.但是比它们更加宽松. javascript 中的一切都是严格区分大小写的.例如变量: demo 和 Demo 两个变量是完全不同的. javascript 标示符,所谓标示符 是指 变量.函数.属性 的名字或函数的参数.标示符的格式是按照以下规则组合的一个或多个字符. 1.第一个字符必须是字母,下划线,或 $ 符号. 2.其他字符可以是字母.下划线.$ . 或数字. 注意 不能把关键字 保留

js基础--javascript基础概念之语句(二)

js基础--javascript基础概念之语句(二)label,break,continue.. break .  continue 语句. break  continue 语句用于在循环中精确控制代码的执行,其中break语句会立即退出循环,执行循环后面的语句. continue 则退出循环后返回到再次进入循环中. 如: var num = 0; for(var i = 0; i<=100; i++){ if(i >= 10){ break; } num = i; } alert(num);

js基础--javascript基础概念之数组(二)

js基础--javascript基础概念之数组 数组栈方法 数组可以像栈一样.栈是一种先进后出的数据结构,最先添加的数据最后一个出来.栈方法添加数据也称为 推入  移除数据称为 弹出. js为数值栈方法提供了 push()   和  pop() ;  两个方法. push() push() 方法接受参数就是你要添加进入到数组的值.push()  方法会将他们逐一添加到数组的末尾  数组的length属性会跟着更新数据. *push(多个数组元素值) 返回的修改后的数组长度 var array =

js基础--javascript基础概念之数组

js基础--javascript基础概念之数组 在ECMAScript 中 ,数组是很常用的数据类型,js中的数组和其他很多语言的数组有明显的区别.js的数组可以保持任何类型的数值,一个数组中可以保存着多个不同类型的数值.js数组大小(长度)是可以调整的.可以随着数据的添加自动增长数组长度. 创建数组: 一.数组字面量 数组字面量由一对包含数组项的方括号[]表示. var array = [ 'kin', 'cheong', 'change', 'hello', 'haha', 'hi' ];

JavaScript高级程序设计之作用域链

JavaScript只有函数作用域:每个函数都有个作用域链直达window对象. 变量的查找由内而外层层查找,找到即止. 同时不仅可以查找使用,甚至可以改变外部变量. var color = "blue"; function changeColor() { var anotherColor = "red"; function swapColors() { var tempColor = anotherColor; anotherColor = color; colo

js基础--javascript基础概念之语句

js基础--javascript基础概念之语句 ECMA-262定义了一组语句(流程控制语句) 语句定义了EMCAScript 语法. 常见的if语句. 语法: if(condition) statement1 else statement2 其中.Condition 可以是任意表达式.而且对这个表达式求值的结果不一定是布尔值.因为script 会自动调用boolean 将值转换为布尔值.如果condition 的值是 true .则执行statement1 语句  否则  执行 stateme

javascript基础拾遗——词法作用域

本来是想写js面向对象笔记(二)关于封装的,但是在敲实例代码的时候,发现对作用域这个东西的概念有点模糊,翻阅了犀牛后,有点感觉了,就想着先记录下此时的感受. 之所以取名叫做词法作用域,是这个概念是js中相当基础也是极为重要的,很多想当然的错误或感觉怪异的问题都是和这个东西有关.所以,本文主要说下这个名词的概念以及讨论下他牵扯出来的有关变量.函数.闭包的问题. 1.由变量开始谈 习惯性先来段代码: 1 var x = "globol value";2 var getValue = fun