变量,作用域

基本数据类型:(五种)

Undefined、 Null、Boolean、Number、String。

引用类型:

Object

异同:
       在复制的时候都会重新复制一个副本,然后再复制给其他变量
不同:

       对于基本数据的类型,复制后,参与任何操作不会受到影响,而引用类型的复制,引用类型的副本实际是一个指针,指向一个堆栈中的对象,当复制后,他们都同指向的同一个对象,所以改变其中一个的值,会影响另外一个的值

var obj1 = new Object;
	obj1.name = 'zl';
	var obj2 = obj1;
	obj2.age = 5;
	obj2.name ='zz';
	console.log(obj1);
作用域:
     块级作用域

      首先明确一点,JavaScript不同于c/c++,它没有块级作用域,什么叫块级作用域呢,在这里给大家举个例子

var sum=0;
for(var i = 0; i< 10; i++)
   {
      sum+=i
   }
console.log(i);//i=10
     作用域链

      书上是这样写的,作用域是保证对执行环境有权访问的所有变量和函数的有序访问。,作用域链的前端,始终都是当前执行的代码所在环境的变量对象。全局执行环境的变量对象始终所示作用域链的最后一个对象。

     对于我来说,作用域链就是告诉了我,我可以访问到哪些变量或者函数,而到底我能访问到哪些变量和函数呢?这里来给大家举一个例子

 var color = 'red';
   function changeColor1 ()
	{
		color = "blur";
		return color;
	}
	function changColor2 ()
	{
		console.log(color);//undefined
		var color = 'yellow';
		return color;
	}
	console.log(color);//red
	console.log (changeColor1());//blue
	console.log(color);//blue
	console.log(changColor2());//yellow
	console.log(color);//blue
     可以发现的是①.寻找变量的时候,从自身作用域开始寻找,如果自身没有,就往上找,这个上呢指的不是随便什么上面都可以,而是说必须是你的父级函数,或者再父级的父级。而不能往下去找,如果找不到,当然会是undefined。可是问题来了,为什么上面代码中,第二个函数里打印的是undefined?这里又得提到一个东西,叫做变量的提升
变量的提升指的是 函数及变量的声明都将被提升到函数的最顶部,其实在changeColor2中,虽然我们打印值放在了 var color = 'yellow';的前面,但是进入函数并不是按顺序执行的哦,他会先定义函数里的变量,比如这里的color会先被定义,然后赋初值为undefined,而var color = 'yellow'只是将color进行新的赋值而已。当然变量的提升也只是一个较为浅层次的说法,其实更深一步,我们得了解什么叫预编译
其实在脚本执行之前,我们的程序还经过了两个步骤,一个是语法分析,还有一个就是我们说的预编译。

语法分析是判断你的基本语法是否出现错误,然后给出相应的出错提示。

当程序开始运行使,页面会创建一个全局对象(Global Object)预编译在函数里开始查找变量的声明和函数的声明,如果找了变量的声明,那么这个变量将作为GO的属性,初值为undefined。而函数也将作为GO的属性,初值为函数体。所以大家应该会理解以下代码

 var color = 'red';
   function changeColor1 ()
	{       console.log(color);//undefined
		var color = "blur";
		console.log(color);//blur
	}
	function changeColor2 ()
	{
		var color = 'yellow';
		var color = function ()
		{
		}
		console.log(color)//ƒ (){}
	}
	changeColor1();
	changeColor2();





参考资料:JavaScript高级程序设计书 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值