js的变量,变量作用域,作用域链

变量声明:
使用var关键字声明,如果使用没有声明的变量,则JS会自动声明此变量根据变量作用域。如果变量只声明为赋值,则此时值是undefined。重复声明变量,在JS不会报错,会依据最后一次的声明来处理变量。
变量作用域:
一个变量的作用域是,程序代码定义这个变量的区域,全局变量在程序代码内任何地方都可以访问。
包括在{}函数,对象内的变量(属性)成为局部变量。
在函数体内定义的变量成为局部变量,作用域也是局部,函数参数也是局部变量。
他们只在函数体内有意义。
在函数体内,局部变量优先于全局变量,也就是说当局部变量与全局变量重名时,会优先使用局部变量。在函数体内定义变量时一定要使用var关键字,或者JS会查早同名全局变量并使用。
函数可以嵌套,父函数定义的变量可以在子函数内有意义。
Var space=’op’;
Function par(){
Var space = ‘par’;
Function son(){
Return space;
}
}
Par(); // => par
Var space=’op’;
Function par(){
Var space = ‘par’;
Function son(){
Var space = ‘son’;
Return space;
}
}
Par(); // => son
函数变量作用域和声明提前。
变量声明在这个函数体内以及这个函数嵌套的任意函数体内都是有定义。
JS的函数作用域意味着:定义的变量在函数体内是始终是可见,这意味这变量在在函数体内声明之前就可以使用。
Var space =’global’;
Function test(){
Console.log(space); //=>undefined 变量虽有定义但是没有值
Var space;space=’function’; //变量在这里赋予初始值,但是变量在函数体内都是有定义的(var space);
Console.log(space); //=> function 变量以赋予初始值
}
注意:由于函数作用域的作用,在函数体内的定义变量,在函数内始终有定义,也就是说JS在检测函数有定义变量的语句时会提前声明变量,而不赋值,当执行到赋值语句的时候的才会给与变量赋值。因此上边代码等于:
Var space =’global’;
Function test(){
Var space;
Console.log(space); //=>undefined 变量虽有定义但是没有值
Var space;space=’function’; //变量在这里赋予初始值,但是变量在函数体内都是有定义的(var space);
Console.log(space); //=> function 变量以赋予初始值
}
JS函数独有这个特性叫做 声明提前。

作为属性的变量:
当生命一个全局变量变量时,实际上定义了一个全局对象的属性,当通过var关键字时次属性是不可配置,不能使用delete删除此变量。当不严格的定义(不实用var)是可以通过delete删除。
JS全局变量是全局对象的属性,局部变量没定义,但是也可以想到是函数对象的属性。
JS 允许使用this来引用全局变量,但是没方法可以引用局部变量。
JS作用域链:
JS是基于词法作用域的:全局变量在程序中始终有意义,局部变量在函数体内及函数嵌套的函数体内始终有意义。
如果将变量看作一个自定义实现的对象的属性,那么换一个角度来解读变量作用域。每一段代码都是有一个与之关联的作用域链。这个作用域链对应着一个对象的列表或者链表。那么当执行程序的时候,JS会一次查找每个对象的作用域链。当发现此变量的时候就定义此变量,当没有此变量就抛出一个错误。
那么对于顶层代码来说(不包含函数定义的语句),就会有一个全局作用域链。
对一个不包含嵌套函数的函数作用域链上包含两个对象:参数变量,局部变量的一个对象,和全局变量对象 。
对于嵌套函数来说:
至少有三个对象::参数变量,局部变量的一个对象,和全局变量对象 。
当定义一个函数保存一个作用域链,当调用这个函数的时候,会创建一个更长的函数调用的对象加到这个作用域链,对于嵌套函数来说更复杂,会重新定义内部函数,并创建一个新的对象加到作用域链。因次每次调用外部函数时作用域链都是不相同的。

时间: 2025-01-07 13:33:41

js的变量,变量作用域,作用域链的相关文章

深入理解JS中的变量作用域

在JS当中一个变量的作用域(scope)是程序中定义这个变量的区域.变量分为两类:全局(global)的和局部的.其中全局变量的作用域是全局性的,即在JavaScript代码中,它处处都有定义.而在函数之内声明的变量,就只在函数体内部有定义.它们是局部变量,作用域是局部性的.函数的参数也是局部变量,它们只在函数体内部有定义. 我们可以借助JavaScript的作用域链(scope chain)更好地了解变量的作用域.每个JavaScript执行环境都有一个和它关联在一起的作用域链.这个作用域链是

javascript 执行环境,变量对象,作用域链

前言 这几天在看<javascript高级程序设计>,看到执行环境和作用域链的时候,就有些模糊了.书中还是讲的不够具体. 通过上网查资料,特来总结,以备回顾和修正. 要讲的依次为: EC(执行环境或者执行上下文,Execution Context) ECS(执行环境栈Execution Context Stack) VO(变量对象,Variable Object)|AO(活动对象,Active Object) scope chain(作用域链)和[[scope]]属性 EC 每当控制器到达EC

执行环境、变量对象和作用域链

执行环境又称执行上下文,英文缩写是EC(Execution Context),每当执行流转到可执行代码时,即会进入一个执行环境.在JavaScript中,执行环境分三种: 全局执行环境 — 这个是最外围的代码执行环境,一旦代码被载入,引擎最先进入的就是这个环境.在浏览器中,全局环境就是window对象,一次所有全局属性和函数都是作为window对象的属性和方法创建的.全局执行环境直到应用程序退出时才会被销毁. 函数执行环境 — 当执行一个函数时,JavaScript引擎进入执行环境.某个执行环境

变量对象、作用域链和This

变量对象 作用域链 This 整理自:https://www.cnblogs.com/TomXu/archive/2011/12/15/2288411.html 系列文章中变量对象,作用域链和this三篇文章 原文地址:https://www.cnblogs.com/shaunyang/p/10348640.html

JS函数、变量作用域

函数参数 函数的()中指定一个或多个形参(形式参数),多个形参之间用,号隔开,声明形参相当于在函数内部声明了对应的变量,但不赋值.在调用时在()中指定实参 ?调用时解析器不会检查实参类型.数量,实参可以是任意的数据类型. 函数返回值 使用return来设置函数的返回值,作为函数的执行结果来返回 return后可以跟任意类型的值 语法:return 值 function sum(a,b,c){ var d = a + b + c; return d; } var result = sum(1,2,

javascript变量声明和作用域提升

以前的知识总是忘,遇到代码又看不懂.要再复习一下,顺便记录一下. 1 add(1,2); 2 function add(a,b){ 3 alert(a+b); 4 } 代码能输出3,为什么不是按顺序执行?应该是  //add is not defined ... javascript的变量声明具有hoisting机制,JavaScript引擎在执行的时候,会把所有变量的声明都提升到当前作用域的最前面. 也就是说,function add(a,b){alert(a+b)}是一个函数声明,告诉我们有

js基础梳理-如何理解作用域和作用域链?

本文重点是要梳理执行上下文的生命周期中的建立作用域链,在此之前,先回顾下关于作用域的一些知识. 1.什么是作用域(scope)? 在<JavaScritp高级程序设计>中并没有找到确切的关于作用域的定义,只是在"4.2执行环境及作用域"中简单说了下执行环境(execution context)的概念.而执行环境其实就是之前博客:js基础梳理-究竟什么是执行上下文栈(执行栈),执行上下文(可执行代码)?中的执行上下文. 而在<JavaScript权威指南>中,对作

作用域,作用域链,垃圾收集,js解析

变量中包含基本数据类型和引用数据类型,基本类型指简单的数据值,引用类型由多个值构成的对象. 引用类型可以为其添加属性和方法,也可以改变和删除属性和方法. 复制变量值: 基本类型:一个变量向另一个变量复制基本类型的值,会在变量对象上创建一个新值,并把该值分配到新变量分配的位置上,两者任何操作不会互相影响. 引用类型:当一个变量向另一个变量复制引用类型的值时,同样也会存储在变量的值复制一份放到位新变量分配的空间中,但是不同的视,这个值的副本只是一个指针,而这个指针指向存储在堆中的一个对象,两个变量引

强大的CSS:var变量的局部作用域(继承)特性

一.CSS变量非全局 最近做项目,发现CSS变量一个有意思的特性,那就是变量作用域非全局. 举个例子,如下HTML和CSS: <div class="box"> <div class="a">测试a</div> <div class="b">测试b</div> <div class="c">测试c</div> </div> .box

【c语言】关于临时变量出其作用域就释放的例子

// 关于临时变量出其作用域就释放的例子 #include <stdio.h> // 临时变量s出函数作用域就销毁了,该空间里就是随机值 unsigned short *sum(unsigned char a, unsigned char b) { unsigned short s = 0; s = a + b; return &s; } int main() { unsigned short *p = NULL; unsigned char a = 1, b = 2; p = sum