<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> <script type="text/javascript"> /** *1. 概念 * 作用域(scope)是结构化变成语言中的重要概念,它决定了变量的可见范围和生命周期 * 正确使用作用域可以使代码更清晰,作用域可以减少命名的冲突,而且是垃圾回收的基本单元 * * 在javasript中作用域不是以花括号包围的块级别作用域(C C++ JAVA等高级语言都是块级别作用域) * 例如: */ (function(){ if(true){ var str = "Hello World !" ; } console.log(str) ; //结果输出 Hello World ! })() ; /** * 1.1 函数作用域 * js的作用域是通过函数来定义的,在一个函数中定义的变量只对这个函数内部可见,称为【函数作用域】 又称为局部作用域 * 在函数中引用一个变量时,js会先搜索当前的函数作用域,如无法找到,则搜索上层作用域,直至全局作用域(这个很关键) * 例如: */ var v = "global" ; (function(){ var v = "local" console.log(v) ; //输出 local })() ; // 再看下面的例子 (function(){ console.log(v) ; //输出 undefined var v = "local" })() ; /** * 上面的例子只是颠倒了一下顺序得到的结果完全不一样 * 输出local显然很好理解 ,那么输出undefined的例子是怎么回事呢? * 前面说了js引用变量的顺序,按照作用域搜索顺序 ,console.log(v) ; 打印变量v时 会先搜索函数的作用域,在此作用域中搜索到了变量v的定义 * var v = "local" 即不会去搜索外层的变量,那么在程序执行打印v的时候 v还没有被初始化结果得到了undefined * * 在访问未定义的变量或定义了但没有初始化的变量时,获得的值都是 undefined。 * 可以认为,无论在函数内什么地方定义的变量,[在一进入函数时就被定义了],但直到 var 所在的那一行它才被初始化, * 所以在这之前引用到的都是 undefined 值。(事实上,JavaScript 的内部实现并不是这样,未定义变量和值为 undefined 的变量还是有区别的。) * * * 再看嵌套的函数作用域 */ var scope = "global" ; function foo01(){ console.log(scope) ; } foo01() ; //输出 global function foo02(){ var scope = "local" ; foo01() ; //输出glocal } alert(1) ; foo02() ; /** * 通过 foo02调用的 foo01在查找 scope定义时,找到的是父作用域中定义的 scope变量,而不是 foo02 中定义的 scope 变量 * 这说明了【作用域的嵌套关系不是在调用时确定的,而是在定义时确定的】。 * * 函数作用域的嵌套关系是定义时决定的,而不是调用时决定的, * 也就是说,js 的作用域是静态作用域,又叫词法作用域,这是因为作用域的嵌套关系可以在语法分析(编译原理一书中会详解这个概念)时确定,而不必等到运行时确定。 * * * 1.2 全局作用域 * 在 JavaScript 中有一种特殊的对象称为【全局对象】 在浏览器中对应的是 window 对象 * 由于全局对象的所有属性在任何地方都是可见的,所以这个对象又称为 全局作用域。全局作用域中的变量不论在什么函数中都可以被直接引用,而不必通过全局对象 * 满足以下条件的变量属于全局作用域: * 在最外层定义的变量; * 全局对象的属性; * 任何地方隐式定义的变量(未定义直接赋值的变量,即不通过 var 声明直接赋值的变量)。 */ </script> </head> <body> </body> </html>
JAVASCRIPT基础01-作用域,布布扣,bubuko.com
时间: 2024-10-25 23:10:04