JAVASCRIPT基础01-作用域

<!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

JAVASCRIPT基础01-作用域的相关文章

《饿了么大前端 Node.js 进阶教程》—Javascript 基础问题—作用域

<饿了么大前端 Node.js 进阶教程>地址:https://github.com/ElemeFE/node-interview 作用域从某种意义上来说是个难点,它需要你真真正正的了解JS的分词.词法分析,语法分析,代码生成,LHS查询,RHS查询等深层的东西. 如果不知道可以读一下<你不知道的JavaScript:上卷> let和var的区别 1.let只在声明的代码块中有效,{}中使用let声明变量,外面是访问不到的,这就是块级作用域 2.不存在变量提升问题 3.重复声明会报

javascript基础01

Javascript能做些什么? 给予页面灵魂,让页面可以动起来,包括动态的数据,动态的标签,动态的样式等等. 如实现到轮播图.拖拽.放大镜等,而动态的数据就好比不像没有js页面一样,把全部内容都 写在页面一股的加载到页面上,而是达到某个条件才把需要的内容加载进去,如瀑布流图片, 动态的标签,就好比一个聊天框,你一条话语,别人一条话语,而这些语段都被标签包住,让后 添加到页面,动态样式就如轮播图的现实效果,我们都知道css实现轮播图是margin或别的属性 让图片运动起来,而动态样式就可以不断改

javascript基础-01

一.运算符 (1)算术运算符( + - * / %) 说明:加.减.乘.除.求余,其中%是求余运算 例:var total = (1 + 4) * 5; var i = 100; var temp = (i – 20) / 2; alert(“10”+ 20) //return 1020; alert(10 + 20) //return 30; (2)后增量/后减量运算符 ++ ,-- 例:var i = 10; var a = i++; // i = i + 1; alert(a); (3)比

js基础--javascript基础概念之变量与作用域

js基础--javascript基础概念之变量.作用域 javascript按照ECMA-262 的定义,变量与其他语言变量有所不同.js变量时松散的,不需要事先定义变量类型的.这使得他只是一个保存特定值的一个名称.变量与其数据类型可以在脚本的生命周期内改变. 还有明白几点: JavaScript的变量作用域是基于其特有的作用域链的,JavaScript没有块级作用域. 基本类型和引用类型的值 ECMAScript 的变量有两种不同的数据类型:分别是 基本数据类型值 和 引用类型值 : 基本数据

JavaScript基础系列目录(2014.06.01~2014.06.08)

下列文章,转载请亲注明链接出处,谢谢! 链接地址: http://www.cnblogs.com/ttcc/tag/JavaScript%20%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86%20%E6%80%BB%E7%BB%93/ 1. Javascript基础---语法(待完成) 2. JavaScript基础---数据类型(待完成) 3. JavaScript基础---Array数组(待完成) 4. JavaScript基础---正则表达式(待完成) 5. Jav

【javascript基础】3、变量和作用域

原文:[javascript基础]3.变量和作用域 前言 这篇和大家说一下javascript中的变量和作用域,由于是将基础嘛,主要给大家捋一下知识,不想翻开书复习的道友可以看一下,打算刚开始学习javascript的同学可以扫一眼. PS:jQuery源码交流群( 239147101)等你来,群里高手云集,让我受益匪浅,尽量少灌水. 变量 javascript中有两种变量,分别是基本类型和引用类型,基本类型是Null,Undefined,String,Boolean,Number这五种,前面简

JAVASCRIPT基础08-购物车(01)

<!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"> <ti

JavaScript基础–作用域

JavaScript基础–作用域 什么是作用域 作用域定义了变量在哪查找和怎样查找的一系列规则.通常我们在JS中定义的变量具有一定调用范围,比如全局变量可以在任意位置调用:而这个范围通常就是我们所指的作用域,JS中的作用域不同于C/C++,那么有哪些不同呢,请先和我一起了解一下JS简单的编译原理 编译原理 JS虽然是一门脚本语言,但是事实上它也是需要编译的(ps.通常脚本语言只需要“解释”,而不是“编译”).但与其他传统的编译语言(例如java)不同的是,JS并不会提前编译好代码等待执行,而是很

JavaScript基础入门 - 01

JavaScript入门 - 01 准备工作 在正式的学习JavaScript之前,我们先来学习一些小工具,帮助我们更好的学习和理解后面的内容. js代码位置 首先是如何编写JavaScript代码,说到这,我们首先要来说明一个需要新人们关注的点,因为我们的js是一门跨平台的语言,所以说,我们的代码可以运行在不同的平台之上.这也就导致了可能相同的代码放在不同的平台运行就会有所出入. 这里面说的平台其实被称之为宿主环境. 同时,代码在不同的平台上的运行方式也有所不同. 如果运行在服务端,那么更多的

javascript基础入门之js中的数据类型与数据转换01

javascript基础入门之js中的数据结构与数据转换01 js的组成(ECMAScript.BOM.DOM)        js中的打印语句:        数据类型        变量        运算符        数据类型转换        js中三大特殊值 js的组成(ECMAScript.BOM.DOM) ①ECMAScript: ECMAScript是一个标准,它规定了语法.类型.语句.关键字.保留子.操作符.对象.(相当于法律):②BOM(浏览器对象模型):对浏览器窗口进行