JavaScript学习笔记【二】

JavaScript的变量、作用域

一、JavaScript的数据类型分为基本数据类型和引用数据类型、

  1.基本数据类型分别包括Null、Undefined、Number、Boolean和String类型、这五种基本数据类型可以通过typeof方法来判定、

  alert(typeof a);其结果分别为‘null‘、‘undefined‘、‘number‘、‘boolean‘、‘string‘、基本类型的赋值是值得传递、例:当把一个变量a的值传递给另外一个变量b时、

  这两个变量a、b就分别有了自己的值、a的操作不会影响到b的值、反之亦然、

  

  2.引用数据类型、

  a.数组、对象等都是引用数据类型、引用数据类型可以添加属性、而基本数据类型却不可以(虽然给基本数据类型添加属性时并没有报错、但却取不到属性的值)、

  var person = new Object;

  person.name = ‘John‘;

  alert(person.name);   //结果为‘John‘;

  b.引用数据类型的判定不能使用typeof方法、应该借用instanceof方法、

  var arr = new Array();

  alert(arr instanceof Array);  // 判定arr是否Arry的一个实例、是则返回true、不是则返回false、此处返回true、

  任何引用数据类型使用  obj instanceof Object时都返回true、因为Object是suoyou类的基类、

  c.引用数据类型进行赋值时是引用的传递、而不是值得传递、例:当把一个引用类型的变量a赋值给b时、只是把引用复制给了b、而a和b指向内存中的同一个对象、

  a的改变必将引起b的改变、反之亦然、

  var a = new Object();

  a.name = ‘John‘;

  var b = a;

  b.name = ‘Smith‘;

  alert(a.name);  //由于变量a和b的引用都指向了同一个内存中的对象、因此b改变的时候、a的值也发生改变、因此此处弹出‘Smith‘;

  

  3.函数中参数的传递、

  在【JavaScript高级程序设计】一书中、说函数的参数传递、都是值的传递(基本数据类型和引用数据类型在作为参数传递时都是值得传递)、

  举了这样的一个例子、

  function setName(obj) {

    obj.name = ‘Smith‘;

    obj = new Object();

    obj.name = ‘XiaoYang‘;

  }

  var person = new Object();

  person.name = ‘John‘;

  setName(person);

  alert(person.name);   //结果为Smith;【JavaScript高级程序设计】这样解释、如果person是按引用传递的、那么在obj.name = ‘XiaoYang‘;

  赋值的时候此处person.name的值就应该变为‘XiaoYang‘了、而结果却为‘Smith‘、<而我个人的理解是在setName中作obj=new Object()时就已经改变了参数obj的引用、

  而引用既然已经改变了、obj值的变化就不会影响到外部person变量的值了、>

  var person = new Object();

  person.name = ‘John‘;

  var obj = person;  //此处obj和person的引用指向同一对象、

  obj = new Object();

  ob.name = ‘Smith‘;

  alert(person.name);  //结果为‘John‘;如果参照【JavaScript高级程序设计】(参数传递为值传递、非参数传递为引用传递)此处的值应该为‘Smith‘、而实际值却为‘John‘、

  因为obj=new Object()改变了obj之前的引用、和person已经指向了不同的对象、因此obj值的改变不会影响到person的值、

  

二、变量作用域、

  1.JavaScript的变量作用域和Java有点不同、在JavaScript中、每个函数都有一个执行环境、全局执行环境是最外层的一个执行环境、

  而JavaScript的代码又是自上而下顺序执行、因此如下代码如果没有定义到指定的函数中、那么它的执行环境就是全局执行环境、所有的变量和函数都是定义在window上的、

  if(true) { var num == 11;}  alert(num);  // 结果为11、同alert(window.num);

  2.在函数内部、变量的作用域不能超过该函数、但内部函数可以访问它的上一层函数的变量、

  var num == 9;  

  function add() {

    var a = num + 1;  /此处可以访问外层的num、

    var b = 1 + c;  //此处会抛出异常、因为在执行环境add中、没有变量c

    function plus() {

      var c = a + b;/此处可以访问外层的a和b、

    }

  }

  JavaScript在使用到变量时、首先在本执行环境中查询、如果查询不到再到上一层环境中查询、一直到最外层的执行环境、但是不会内部的执行环境中去查询、

  

  3.延长变量作用域、with和catch语句

  function add() {

    var qs = ‘?debug=true‘;

    with(location) {

      var url = href + qs;

    }

    return url;  // 此处url越过了with语句、在with语句外部也可以访问、

  }

  【javaScript高级程序设计】中说、catch语句捕获的错误会被添加到执行环境的变量对象中、而不是catch语句的变量对象中、因此在catch语句外部也可以访问错误对象、

  如下代码、在Chrome中却发现、在catch外部无法访问err对象 

  function add() {
    try {
      var a = b + 1;

      return a;
    } catch(err) {
      console.log(err.message);
    }
    console.log(‘[‘ + err.message + ‘]‘);  //此处无法访问err对象、
  };
  add();

  

  

时间: 2024-07-29 23:48:13

JavaScript学习笔记【二】的相关文章

javascript学习笔记(二)

一.javascript的放置.注释.输出工具 1.输出工具 a.alert():属于window中的全局函数.无论写入什么,都以字符串形式输出. b.document.write():向网页输出内容. c.var vlaue=prompt("显示内容","文本框显示内容")value为返回值:弹出一个输入框,接收参数. <script> alert(123); document.write("<h1>周静文</h1>&

前端乱煮之javascript学习笔记二

1 javascript的隐式转换规则: 若有布尔类型,则将它转换为数值进行比较. 若有NaN,一律返回false 若是字符串,则分为三种情况:对方为字符串就直接比较,对方为数值,则将字符串转化为数值,若对方为对象,则将对象用toString()的方法进行转换,然后再比较.最后,若是其他,则一律返回false. 若是数字,如果对方是对象,用valueOf()进行比较,其余一律返回false null 和defined不会进行类型转换,但是二者相等. 2 javascript中的break和con

Javascript 学习 笔记二

1.查找HTML元素 通常,通过 JavaScript,您需要操作HTML 元素. 为了做到这件事情,您必须首先找到该元素.有三种方法来做这件事: 通过id找到HTML元素(本例查找 id="intro" 元素) var x=document.getElementById("intro"); 通过标签名找到HTML元素(本例查找 id="main" 的元素,然后查找 "main" 中的所有 <p> 元素) var

JavaScript学习笔记二:在HTML中使用JS

1. <script>元素的6个属性:async.defer.charset.language.src.type. 其中只有src最为常用,其他的使用缺省值即可. 2. 通过<script>元素引用外部文件示例: 1 <script src="example.js"></script> 注: a. 为了符合html规范以及浏览器的兼容性,尽量不要写成下面的样式. 1 <script src="example.js"

Javascript 学习笔记 2: 标识语句

可以在任何语句声明之前使用唯一标识(identifier)和冒号(:)用来标记该语句: identifier: statement 这样,你可以在程序的任何其他地方通过标识来使用这个语句.即使在语句内部也可以使用该语句的标识(例如:循环语句和条件语句).当在一个循环语句前添加一个标识,你可以在语句内部通过break 标识来退出当前循环,也可以通过continue标识来继续执行该语句.例如: mainloop: while(token != null) { // Code omitted... c

JavaScript--基于对象的脚本语言学习笔记(二)

第二部分:DOM编程 1.文档象模型(DOM)提供了访问结构化文档的一种方式,很多语言自己的DOM解析器. DOM解析器就是完成结构化文档和DOM树之间的转换关系. DOM解析器解析结构化文档:将磁盘上的结构化文档转换成内存中的DOM树 从DOM树输出结构化文档:将内存中的DOM树转换成磁盘上的结构化文档 2.DOM模型扩展了HTML元素,为几乎所有的HTML元素都新增了innerHTML属性,该属性代表该元素的"内容",即返回的某个元素的开始标签.结束标签之间的字符串内容(不包含其它

Ajax学习笔记(二)

二.prototype库详解 1.prototype库的使用 //导入下载好的prototype.js文件 <script type="text/javascript" src="prototype.js"></script> //在自己的js中直接使用Prototype对象 <script type="text/javascript"> document.writeln("Prototype库的版本

公益图书馆-学习笔记二

1.在视图中显示控制器变量. 在控制其中为变量赋值即可,如 $this->info_user=$user;然后在视图中可直接使用. 2.html显示数组使用 volist标签 <volist name="info_user" id="vo"> {$vo.username} {$vo.email}即可使用数组里的键值对 3.隐藏button <button type="submit" style="display:

【Unity 3D】学习笔记二十七:unity游戏脚本(七)

使用C#编写游戏脚本 在前面提到,unity支持三种语言编写脚本:js,C#,boo.入门的时候建议只用js,因为js比较简单易懂,语法也不是很严格.但后来晋级的时候推荐使用C#,因为它比较符合unity的编程思想,执行效率更高.下面总结下怎么使用C#编写脚本. 继承MonoBehaviour类 在unity中,任何一个脚本,包括上述三种语言都需要去继承MonoBehaviour这个类.为什么我们之前写JS代码的时候没有继承咧?因为在创建JS代码的时候,系统会将其类名与继承关系隐藏起来. 在pr

AJax 学习笔记二(onreadystatechange的作用)

AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了onreadyStateChange事件实现这一功能.这类似于回调函数的做法.onreadyStateChange事件可指定一个事件处理函数来处理XMLHttpRequest对象的执行结果,如: 复制代码 代码如下: ajaxObj=createAjaxObject(); var url="/MyTod