函数作用域及作用域链

变量作用域

全局作用域

在JavaScript中全局变量的作用域比较简单,它的作用域是全局的,在代码的任何地方都是有定义的。然而函数的参数和局部变量只在函数体内有定义

1.函数外面定义的变量拥有全局作用域

var n =2;
function fn() {
  var a= 1;
  return a;
 }
 console.log(fn())//1
 console.log(n)//2
 console.log(a)//报错 error

2未定义直接赋值的变量自动声明为拥有全局作用域

var n =2;
function fn() {
    a= 1;
  return a;
 }
 console.log(fn())//1
 console.log(n)//2
 console.log(a)//1

3.window对象的属性拥有全局作用

局部作用域

局部作用域一般只在固定的代码片段内可访问到,最常见的例如函数内部,所以在一些地方会把这种作用域成为函数作用域。

图一中,a是函数内部声明并赋值,拥有局部作用域,只能带函数fn内部使用,在fn外部使用就会报错,这就是局部作用域的特性,外部无法访问。

3ES6的块级作用域

ES5只有全局作用域和函数作用域,没有块级作用域,会带来下面问题:

ES6引入了块级作用域,明确允许在块级作用域中声明函数,let和const命令都涉及块级作用域。

作用域链

函数的作用域实际上是个动态概念 只有函数调用时,才会在内存中动态开辟一个自己的作用域,函数调用完了这个作用域又关闭了,函数运行过程中在内存创建的数据又被清除了

通俗地讲,当声明一个函数时,局部作用域一级一级向上包起来,就是作用域链。

1.当执行函数时,总是先从函数内部找寻局部变量

2.如果内部找不到(函数的局部作用域没有),则会向创建函数的作用域(声明函数的作用域)寻找,依次向上

原文地址:https://www.cnblogs.com/xcyzkh/p/11311867.html

时间: 2024-10-09 02:11:15

函数作用域及作用域链的相关文章

Python全栈__动态参数、名称空间、作用域、作用域链、加载顺序、函数的嵌套、global、nonlocal

1.动态参数 当实参数量与形参数量相等时,参数传递正常. def func1(a, b, c): pass func1(1, 2, 3) 当实参数量与形参数量不相等时,则会报错. def func1(a, b, c): pass func1(1, 2, 3, 4, 5, 6, 6) 用户传入到函数中的实参数量不确定时,或者为了以后扩展,此时要用到动态参数 *args  **kwargs(万能参数). 顺序: 位置参数,*args,默认参数,**kwargs 1.*args *args是接收的是所

javascript数据类型(六)--- 函数对象之作用域和作用域链

一.作用域 1.1 理解 * 就是一块"地盘", 一个代码段所在的区域 * 它是静态的(相对于上下文对象), 在编写代码时就确定了 1.2  分类 * 全局作用域 * 函数作用域 * 没有块作用域(ES6有了) 1.3 作用 * 隔离变量,不同作用域下同名变量不会有冲突 1.4 作用域与执行上下文的区别 区别1:创建的时间不同 全局作用域之外,每个函数都会创建自己的作用域,作用域在函数定义时就已经确定了.而不是在函数调用时 全局执行上下文环境是在全局作用域确定之后, js代码马上执行之

js中函数作用域,作用域链,变量提升

先来分析几个容易出错的题目 第一题: var foo = 1 function bar(){ if(!foo){ var foo = 10; } console.log(foo) } bar() 这道题大家会误认为是1 其实在内部函数执行时,无论这个判断是否成立,都会对声明变量进行提升,所以var foo = undefined,所以在内部判断,因为undefined是false,取反就是true,执行var foo = 10,所以: 最后答案就是10 第二题: var n = 0 functi

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

变量声明: 使用var关键字声明,如果使用没有声明的变量,则JS会自动声明此变量根据变量作用域.如果变量只声明为赋值,则此时值是undefined.重复声明变量,在JS不会报错,会依据最后一次的声明来处理变量. 变量作用域: 一个变量的作用域是,程序代码定义这个变量的区域,全局变量在程序代码内任何地方都可以访问. 包括在{}函数,对象内的变量(属性)成为局部变量. 在函数体内定义的变量成为局部变量,作用域也是局部,函数参数也是局部变量. 他们只在函数体内有意义. 在函数体内,局部变量优先于全局变

作用域、作用域链、闭包

作用域.作用域链 一.Js以前没有块级作用域,不过在ES6中有let了. 二.Js使用函数作用域 function aaa(){ var a = "a"; } console.log(a);//报错 三.声明提前 console.log(aaa)//报错 console.log(aaa);//undefined 声明未定义 var aaa; console.log(aaa); //undefined 声明未定义 var aaa = "aaa"; 四.Js的作用域链

JavaScript 开发进阶:理解 JavaScript 作用域和作用域链

作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理.今天这篇文章对JavaScript作用域和作用域链作简单的介绍,希望能帮助大家更好的学习JavaScript. JavaScript作用域 任何程序设计语言都有作用域的概念,简单的说,作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期.在JavaScript中,变量的作用域有全局作用域和局部作用域两种. 1.  全局作用域(Global S

JavaScript作用域和作用域链

JavaScript 开发进阶:理解 JavaScript 作用域和作用域链 来源:梦想天空  http://www.cnblogs.com/lhb25/archive/2011/09/06/javascript-scope-chain.html 作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理.今天这篇文章对JavaScript作用域和作用域链作简单的介绍,希望能帮助大家更好的学习JavaScript. Java

关于Javascript作用域及作用域链的总结

本文是根据以下文章以及<Javascript高级程序设计(第三版)>第四章相关内容总结的. 1.Javascript作用域原理,地址:http://www.laruence.com/2009/05/28/863.html 2.JavaScript 开发进阶:理解 JavaScript 作用域和作用域链,地址:http://www.cnblogs.com/lhb25/archive/2011/09/06/javascript-scope-chain.html 在介绍有关作用域的内容之前,先来介绍

理解javascript作用域和作用域链

作用域 作用域就是变量和函数的可访问范围,控制着变量和函数的可见性与生命周期,在JavaScript中变量的作用域有全局作用域和局部作用域. 全局和局部作用域下面用一张图来解释: 单纯的JavaScript作用域还是很好理解的. 作用域链 全局执行环境是最外层的一个执行环境,在web浏览器中全局执行环境是window对象,因此所有全局变量和函数都是作为window对象的属性和放大创建的.每个函数都有自己的执行环境,当执行流进入一个函数的时候,函数的环境会被推入一个函数栈中,而在函数执行完毕后执行