函数作用域理解

函数中的作用域搜索顺序:L---E---G---B

L-----local,局部名字空间,即局部变量,在函数内部找

E-----enclosing,直接外围空间,

G-----global,全局名字空间,即全局变量

B-----builtin,内建名字空间

1 x = 10
2 def f():
3     x +=  2
4     print(x)    #结果报错,由于函数内x被赋值,则认为是局部变量,在函数内寻找,
5 f()             #找到结果是x还没被定义,报错
1 x = 10
2 def f():
3     global x   #定义x为全局变量
4     x +=  2     #则x会往外部找,找到10,所以执行结果12
5     print(x)
6 f()    
 1 x = 9
 2 def bb():
 3     global x        #定义全局变量
 4     print(x,1)      #执行结果9
 5     x = 8
 6     def cc():
 7         global x  #定义全局变量
 8         x += 1    #赋值了认为是内部变量,在内部查找,找到x被定义全局变量,到外面拿到9
 9         print(x,2)  #执行结果9
10     cc()
11 bb()
12 ##########################
13 x = 9
14 def bb():
15     global x
16     print(x,3)   #执行结果9
17     x = 8
18     def cc():
19         global x     #这个定义可有可无
20         print(x,4)   #执行结果8,没赋值则直接向外找
21     cc()
22 bb()
时间: 2024-08-01 10:22:10

函数作用域理解的相关文章

理解函数作用域与闭包

前言 但凡读书,或者学一门技术,都要问自己以下几个问题. 它是什么? 它有什么用?/发明它是为了解决什么问题? 它有什么弊端? 我下面就试着从这几个方向来阐述闭包这个概念. 概念 在了解闭包之前,我们需要了解几个概念.本文在这里只做简单介绍,如需要进一步了解,请参考文章末尾的链接. 作用域 变量和函数的可作用范围,分为局部作用域和全局作用域.Javascript不具有块级作用域,而具有函数作用域. 执行环境(execuation context) 变量和函数有权访问的其他数据. 执行环境栈(ex

怎样理解全局作用域和函数作用域

前言: 全局作用域下声明的变量再其他作用域下也可以使用, 但函数作用域下声明的变量, 无法在全局作用域下使用. var name1 = "Lilei"; function fn() { var name2 = "Hanmeimei"; console.log(name1); console.log(name2); } fn(); // "Lilei" // "Hanmeimei" console.log(name2); //

js中(function(){…})()立即执行函数写法理解

javascript和其他编程语言相比比较随意,所以javascript代码中充满各种奇葩的写法,有时雾里看花,当然,能理解各型各色的写法也是对javascript语言特性更进一步的深入理解. ( function(){…} )()和( function (){…} () )是两种javascript立即执行函数的常见写法,最初我以为是一个括号包裹匿名函数,再在后面加个括号调用函数,最后达到函数定义后立即执行的目的,后来发现加括号的原因并非如此.要理解立即执行函数,需要先理解一些函数的基本概念.

JavaScript 函数作用域的“提升”现象

在JavaScript当中,定义变量通过var操作符+变量名.但是不加 var 操作符,直接赋值也是可以的.例如 : message = "hello JavaScript ! " 即定义了一个全局变量message,并赋值 "Hello JavaScript!"--<JavaScript高级程序第三版> 如同往日一般,一群人在所谓的技术交流群里面相互斗图着.突然老王莫名的正经起来,在群里发了一道JavaScript的题目,让大家猜一猜这道题的答案. v

javascript篇-----函数作用域,函数作用域链和声明提前

在一些类似C语言的编程语言中,花括号内的每一段代码都具有各自的作用域,而且变量在声明它们的代码段之外是不可见的(也就是我们不能在代码段外直接访问代码段内声明的变量),我们称之为块级作用域,然而,不同于这类型的编程语言,javascript是没有块级作用域.取而代之的,javascript使用的是块级作用域:变量在声明它们的函数体以及这个函数体嵌套的任意函数体内都是有定义的. 在如下的所示的代码中,在不同位置定义了变量 i . j 和 k ,它们都在同一个作用域内——这三个变量在函数体内均是有定义

变量作用域&amp;函数作用域

一. 变量作用域 1)全局变量 在全局环境下声明的变量被视为全局变量. 在没有使用var进行声明的时候,变量就被定义为全局变量.在ES5的严格模式下,如果变量没有使用var来声明是会报错的. 2)局部变量 在函数体内部声明的变量被视为局部变量.其中涉及到js中的函数作用域问题. 二. 函数作用域 因为js中是没有块级作用域的概念,所谓的块级作用域就是指花括号内的的每一段代码都有其自己的作用域,但js中并不是,例如for循环中定义的变量,外界也可以访问:但是js中有函数作用域的概念,即在每一个函数

javascript的函数作用域及声明提前

废话不说:先来段代码: var scope='global';function test(){    alert(scope);        // 输出undefine:而不是global    var scope='local';      alert(scope);        // 输出local}test(); 脑算下:你可能会认为第一alert会输出global: 但是事实上第一个alert输出的是undefined: 这是怎么回事呢? 要探讨这个问题首先要解释下两个概念: 1:函

IIFE-js中(function(){…})()立即执行函数写法理解

介绍IIFE IIFE的性能 使用IIFE的好处 IIFE最佳实践 jQuery优化 在Bootstrap源码(具体请看<Bootstrap源码解析>)和其他jQuery插件经常看到如下的写法: Js代码   +function ($) { }(window.jQuery); 这种写法称为: IIFE (Imdiately Invoked Function Expression 立即执行的函数表达式). 一步步来分析这段代码. 先弄清函数表达式(function expression)和 函数

JS函数——作用域

一 : 作用域的相关概念 首先看下 变量作用域 的概念:一个变量的作用域是程序源代码中定义这个变量的区域.————————<javascript权威指南>第六版全局变量拥有全局作用域,函数体内定义的局部变量拥有函数作用域. 就个人理解,作用域(scope),顾名思义,是一块区域 或 领域 ,并且有某些对象(包括变量,属性,方法等)能够在这里起作用:作用域是在定义的时候决定的,和什么时候执行无关:这时候问题来了: 问题1:区域在那儿? 他是一个概念,是看不到摸不着的:在这个区域内原本是什么都没有