首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

作用域和声明生命

作用域 一段代码中存在变量的可使用范围,超出这个范围,这个变量就不可以被访问了 1.局部变量 在某个函数的内部声明的变量称为局部变量。这些变量只能被申明的函数使用。局部变量在函数外是不能使用的。...但是在函数内,如果两个名字一样的话,会用局部变量的值,全局变量不会被使用。...g = %d\n", g); return 0; }  value of g = 10 ### 3.形参 函数的参数,形式参数,被当作该函数的局部变量,如果和全局变量同名的话,他们会被优先使用...include / 全局变量声明 / int a = 20; int main () { / 在主函数中的局部变量声明 / int a = 10; int b = 20; int...因为我们已经知道栈是怎么样的情况了,就可以更好地理解生命周期了 ### 1.局部变量 通俗地讲局部变量的声明周期从{}结束而消失,{}就表示一个代码块,出了这个块的变量也就超出了作用域,生命周期也是会结束

12410

作用域与声明提升

一.作用域 作用域是可访问变量的集合,简单来说就是变量的作用范围。在JavaScript中作用域分为全局作用域和函数作用域。 1.全局作用域 直接在script标签中编写的代码都运行在全局作用域中。...全局作用域在打开页面时创建,在页面关闭时销毁。 全局作用域中有一个全局对象window,window对象由浏览器提供,可以在页面中直接使用,它代表的是整个的浏览器的窗口。...2.函数作用域 函数作用域是函数执行时创建的作用域,每次调用函数都会创建一个新的函数作用域。 函数作用域在函数执行时创建,在函数执行结束时销毁。 在函数作用域中创建的变量,不能在全局中访问。...通俗地讲就是先上车后补票,先使用,后声明。 1.变量声明提升 在全局作用域中,使用var关键字声明的变量会在所有的代码执行之前被声明,但是不会赋值。...总结 函数声明和变量声明总是会被解释器悄悄地被”提升”到方法体的最顶部。两者区别不大,两者的生命周期略有差异,都取决于它们处于函数作用域还是全局作用域。

34220
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    JavaScript 中的作用域和声明提升

    (name) // Jack } console.log(name) // Leo 如果在声明一个变量的时候没有使用 var 关键字,那么变量将成为一个全局变量。...关于 ES6 中 使用 let 和 const 声明块级作用域的内容,可以参考 JavaScript 中的 let 和 const。...所以上述例子中可以看到变量 b 在声明后,被提升到作用域顶部,和 a 一样,获得了 undefined 的值。 除了变量声明会提升,函数声明也会提升。...foo() {}; 变量声明:形如 var bar; 函数声明和变量声明总是会被移动(即 hoisting)到它们所在的作用域的顶部。...变量声明(赋值) > 形参 > 语言内置变量 > 变量声明不赋值 > 函数外部作用域的其他所有声明 总结变量优先级正好验证了作用域链式查找,局部作用域 -> 上一级局部作用域 -> 全局作用域 -> TypeError

    55020

    前端入门17-JavaScript进阶之作用域声明正文-作用域

    正文-作用域 在 ES5 中,变量的作用域只有两类: 全局作用域 函数作用域 只要不是在函数内部定义的变量,作用域都是全局的,全局的变量在哪里都可以被访问到,即使跨 js 文件。...函数作用域是指在函数体定义的变量,不管有没有在函数体的开头定义,在函数体的任何地方都可以被使用,因为 JavaScript 中的变量有声明提前的行为。...但在 JavaScript 中,变量作用域只分函数作用域,而且变量有声明提前的特性,所以在函数体内部第一次输出 i 时,此时变量已经提前声明,但还没初始化,所以会是 undefined。...那么,有想过,这些似乎理所当然的基础常识原理是什么吗? 我们先来看些理论,再结合理论返回来分析这个例子,但只分析变量的声明提前原理,至于作用域的原理留着作用域链一节分析。...以上,就是变量声明提前的原理,当然,创建执行上下文的过程中,还涉及到其他很多工作,用来实现例如作用域链等机制,留待后续来说。

    54020

    前端入门18-JavaScript进阶之作用域链声明正文-作用域链

    解析阶段会去解析当前上下文的代码,如果碰到是变量声明语句,那么将该变量添加到上下文的 VO 对象中,如果碰到的是函数声明语句,那么会将当前上下文的作用域链对象引用赋值给函数的内部属性 [[Scope]]...所以,当进入执行阶段,开始执行全局代码时,全局变量已经全部添加到全局 EC 的 VO 里的,这也就是变量的提前声明行为,而且对于全局 EC 来说,它的作用域链就是它的 VO,同时,因为解析过程中遇到了函数声明语句...,开始从作用域链中寻找,首先在 b函数EC.VO 中寻找,没找到;接着到下个作用域节点 a函数EC.VO 中寻找,发现存在 num 这个变量,所以 b 函数内使用的 num 变量是来自于 a 函数内部,...总之,JavaScript 中的变量之所以可以在定义后被使用,是因为定义的这些变量都被添加到当前执行上下文 EC 的变量对象 VO 中了,而之所以有全局和函数内两种作用域,是因为当前执行上下文 EC 的作用域链属性的支持...这里的外层函数,指的是针对于函数声明位置的外层函数,而不是函数调用位置的外层函数。作用域链只与函数声明的位置有关系。

    44230

    初探JavaScript(四)——作用域链和声明提前

    今天首先介绍下Javascript的函数作用域的概念,然后了解下什么是作用域和声明提前,最后通过一个例子剖析Javascript的作用域链。...如果在函数f()中声明一个局部变量也为g,则全局变量就会被局部变量覆盖 ? 2.作用域和声明提前   看到Javascript作用域这块,可以说颠覆了以前我对作用域的认识。...类似Java和C等编程语言,在花括号“{}”内的代码都是有各自的作用域的,并且在这个范围以外,这些变量是不可见的,我们称这种作用域为块级作用域。   ...函数作用域简言之就是:变量在声明他们的函数体以及这个函数体嵌套的任意函数体内都是有定义的。   ...以上是我的个人理解,如果你对这两种情况有自己的理解,请在下方给出,望不吝指教。 3.作用域链 全局变量在程序中始终是有定义的,局部变量在声明它的函数体内以及其所嵌套的函数内始终是有定义的。

    73750

    【JavaScript】作用域 ② ( JavaScript 块级作用域 | ES6 之前 等同于 全局局部作用域 | ES6 使用 let const 声明变量 常量 有 块级作用域 )

    ; 全局作用域 是 在 全局范围内可见的 , 也就是在 标签内部 和 js 脚本中 ; 局部作用域 是指在一个 函数内部声明的变量 只在这个函数内部可见 ; 使用了 var...关键字 声明的 变量 实际上具有 函数作用域 或 全局作用域 ; 如果 if 语句在 函数内部 , 则 在 if 代码块中 使用 var 声明变量 , 具有 函数作用域 ; 如果 if 语句在 全局作用域中..., 则 在 if 代码块中 使用 var 声明变量 , 具有 全局作用域 ; 2、块级作用域 - ES6 使用 let / const 声明变量 / 常量 ES6 引入了 let 和 const 关键字..., 这两个关键字 声明的 变量 或 常量 具有块级作用域 ; 在 {} 代码块中 , 使用 let 或 const 声明 变量 或 常量 , 在 代码块 外部无法访问 ; 3、代码示例 - ES6 之前的块级作用域...= 全局作用域 在下面的代码中 , 在 {} 代码块中 , 使用 var 关键字声明的变量 , 不具有块级作用域 , 而是具有 函数作用域 或 全局作用域 ; num 是在 if 语句内部声明的 ,

    42810

    var let const作用域_实例变量用什么声明

    大家好,又见面了,我是你们的朋友全栈君。 输入 全局作用域中,用const和let声明的变量去哪了? 问题 各位大佬,问个问题,let、const声明的变量,暴露在全局,为什么没挂载到window下?...输出 我们打开控制台,输入 const a = 123; function abcd() { console.log(a); // abcd函数的作用域能访问到a }; dir(abcd);...可以在方法的[[Scopes]] 属性中,看到变量a const、let 这类都是,属于声明性环境记录,“Declarative Environment Records” ,和函数、类这些一样,在单独的存储空间...var这类,属于对象性环境记录,“object environment record”,会挂载到某个对象上,也会沿着原型链去向上查找 说明const、let声明变量不挂载到对象上,但是在全局的活动对象中能访问到...let、const 声明记录,也就是作用域链那边没问题 但是不是全局window对象的属性,所以window.a访问不到 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn

    39220

    全局作用域、函数作用域、块级作用域的理解

    1.前言 作用域是任何一门编程语言中的重中之重,因为它控制着变量与参数的可见性与生命周期。很惭愧,我今天才深入理解JS的作用域..我不配做一个程序员.....ES6中新增的概念,在ES5中是没有的,ES5中没有? 没有的时候我们代码也写的好好的,现在新增的概念,我不用不行吗? 来,拋一个典型的问题出来,你就明白块级作用域出现的重要性了。...使用let和const以后会发现,他们声明的变量作用域范围不会超过{}这个圈 for(let i = 0; i < 5; i++){}; console.log("i =",i); //i is...// 大括号中a使let声明,所以只能在声明后使用(不存在声明提前,a = undefined的情况) var a = 10; { console.log(a); //Uncaught ReferenceError...,是可以修改内部属性的,数组同理; 5.总结 主要总结一下块级作用域、以及块级作用域出现的意义,方便更好的记住。

    3.1K10

    JavaScript中的作用域和作用域链

    3.函数作用域 函数作用域,是指声明在函数内部的变量,和全局作用域相反,局部作用域一般只在固定的代码片段内可访问到,最常见的例如函数内部。...正因为如此, ES6 引入了块级作用域,让变量的生命周期更加可控。 4. 块级作用域 块级作用域可通过新增命令 let 和 const 声明,所声明的变量在指定块的作用域外无法被访问。...如果一个标识符已经在代码块内部被定义,那么在此代码块内使用同一个标识符进行 let 声明就会导致抛出错误。...因为 let 不能在同一作用域内重复声明一个已有标识符,此处的 let 声明就会抛出错误。但如果在嵌套的作用域内使用 let 声明一个同名的新变量,则不会抛出错误。...定义的标识符的越深,那么读写的速度也就越慢,而全局变量总是处于作用域链的最末端,所以当变量解析的时候,查找全局变量是最慢的,所以在编写代码的时候要尽可能少的使用全局变量,尽可能使用局部变量。

    2.2K10

    作用域和作用域链的简单理解

    作用域和作用域链 作用域 javascript采用的静态作用域,也可以称为词法作用域,意思是说作用域是在定义的时候就创建了, 而不是运行的时候。...思路是完美的,可是js的作者采用的静态作用域,不管你们怎么运行,你们 定义的时候作用域已经生成了。 那么什么是作用域? 变量和函数能被有效访问的区域或者集合。作用域决定了代码块之间的资源可访问性。...作用域也就是一个独立的空间,用于保护变量防止泄露,也起到隔离作用。每个作用域里的变量可以相同命名,互不干涉。就像一栋房子一样,每家每户都是独立的,就是作用域。...作用域又分为全局作用域和函数作用域,块级作用域。 全局作用域任何地方都可以访问到,如window,Math等全局对象。 函数作用域就是函数内部的变量和方法,函数外部是无法访问到的。...块级作用域指变量声明的代码段外是不可访问的,如let,const. 作用域链 知道作用域后,我们来说说什么是作用域链? 表示一个作用域可以访问到变量的一个集合。

    80931

    TypeScript 中的变量声明:变量声明的语法、变量的作用域、变量的类型推断和类型断言

    本文将详细介绍 TypeScript 中的变量声明,包括变量声明的语法、变量的作用域、变量的类型推断和类型断言等内容。...变量声明在 TypeScript 中,我们可以使用 let 和 const 关键字来声明变量。let 用于声明可变(可重新赋值)的变量,而 const 用于声明不可变(不可重新赋值)的变量。...下面分别介绍这两种变量声明方式。let 变量声明let 关键字用于声明可变的变量。它的作用范围被限制在块级作用域内。块级作用域是由花括号 {} 包围的一段代码。...变量作用域变量作用域是指变量在哪些地方可以被访问到。在 TypeScript 中,变量的作用域可以分为全局作用域和局部作用域两种。全局作用域全局作用域中声明的变量可以在整个程序中的任何地方访问到。...局部作用域局部作用域中声明的变量只能在该作用域内部访问。

    78320

    【SQL】小心在循环中声明变量——浅析SQL变量作用域

    PRIMARY KEY) --主键唯一约束 INSERT @t VALUES (1) SET @i += 1 END 如果你认为这个语句跑起来没问题,那你值得看下去,会避免以后踩到【SQL变量作用域...其实这个问题本质上是一个变量作用域问题,只不过SQL中的变量作用域,与C#等语言按语句块划分不一样,SQL的变量作用域是【批】,这一点在MSDN中有说。...原因就在于声明语句比较特殊,它并不依赖位置,系统“见到”就算数,所以不管变量在多深的语句块中声明,它在本批接下来的语句中都是有效的。...印象中某种SQL的写法是声明在一个区,逻辑在一个区,既然你t-sql的声明具有“提升”这种特点,我认为做成那种比较好,而不是混在逻辑语句中搞特殊。...回到开头的问题,现在我们清楚,虽然变量在循环中声明,但它并不会被多次执行,甚至不是在第1圈的时候执行,而是在某个时机由系统将所有声明统一执行,大概类似C#的静态字段,不管定义在哪里,CLR会确保在使用该类前完成初始化

    1.7K20

    作用域及作用域链的解释说明

    局部变量是在函数体内声明而且只作用在函数体内部以及该函数体的子函数的变量。下面我们对全局作用域和局部作用域来做一个深入的理解。 全局作用域 全局变量拥有全局作用域,在代码的任何地方都有定义。...一般有两种情况变量会拥有全局作用域: 最外层函数和在最外层函数外面定义的变量拥有全局作用域 所有未定义的直接赋值的变量自动声明为全局变量,也就是拥有全局作用域 var scope="global";...块级作用域 在ES6中新增了一种作用域就是块级作用域,块级作用域和变量的声明方式有关系,那就是使用let命令用来进行变量声明,使用let命令声明的变量只在let命令所在代码块内有效。...原因就在于var声明的变量没有块级作用域,在for中声明和直接声明全局变量是没有区别的,那么来看一下解决办法: 1.使用闭包 var data = []; for (var i = 0; i 使用let声明变量i 在上面我们提到了,let声明的变量有块级作用域一说,来看一下他的运行原理: var data = [];// 创建一个数组data; // 进入第一次循环 { let

    1.1K20
    领券