基础1、只有函数有作用域2、如果在<script src>的src 中设置了src特性,则script元素包含的任意代码就无效了。应该分开放到不同的script块中。3、外部js脚本文件和页面内嵌的js代码的执行顺序是按它们在文档中的位置决定的,而不是先执行内嵌脚本,后执行外部脚本文件。4、建议通过外部文件形式导入js文件。5、使用接口技术解决js文件函数重名的冲突。问题是如果封装的接口也冲突了怎么办?定义接口的对象名也不能够相同,否则也会冲突。P46 这个例子没运行起来。6、Js为CSS设置样式,是以html文件为参考的,而不用考虑js文件的具体位置,而css文件是以它本身位置为参考的。7、浏览器是从上到下解析网页源码的。8、接口的概念?9、使用变量之前必须先声明。尽量少使用全局变量。10、怎么区分构造函数、类和一般的函数?在命名时构造函数和类名建议首字母大写,而函数小写开头11、使用alert和confirm进行手动调试第四章 数据类型和变量1、实词和虚词。实词指标识符、关键字保留字、直接量等。虚词指空白符、换行符、注释等无意义的字符。实词是区分大小写的。2、Js只有三种数据类型:数值型(不区分浮点和整数,都是浮点型)、字符串型和数组型。null、undefined,number,string,Boolean是五种原始数据类型。objectfunction是对象。是object的特殊情况。棧存储值类型,堆存储引用类型。3、alert(Boolean(1));//返回的是true。书上返回的是13。有误alert((a = 1,2,3,4));//4alert(a=(1,2,3,4));//4alert(Boolean(1));//truea = 1,2,3,4;alert(a);//1 var a = 1,2,3,4;alert(a);//null4、JS仅支持定义一维数组。不支持多维数组。但是可以模拟多维数组。但是性能不好。Var a = [[1,2,3],[4,5,6]];。数组可以放入不同的任意类型的数据,包括function和表达式。5、函数在js中是第一种类型(基类,父类),其他类型继承于function。Object也是由Function来实现的。这点很NB啊。6、函数如果没有返回值,责约定返回值是undefined。7、函数是一个独立的作用域,只能通过函数返回值读取函数内部的数据。而构造函数是可以通过this.属性,获取函数内部的属性值。构造函数是定义对象的模板,就是类。8、函数解析的机制:js解释器在预编译时就会把所有function语句声明的函数处理,如果存在同名函数,则后面的函数体会覆盖前面的函数体。而js解释器只是对var语句声明的变量名进行索引,变量的初始化值却被忽略,直到执行期才去为变量读取初始值。而对于function声明的函数体,js解释器不仅对函数盟按变量标识符进行索引,而且对于函数体也提前处理。第一:Javascript时按<script></script>编译,并执行的。第二:JavaScript编译时完成对变量的声明,及函数处理。第三:JavaScript后声明的函数将会覆盖前声明的函数9、处于同一个文档中的js教本,都属于同一个作用域:window。可以互相通信和调用。10、Constructor属性。表示构造函数的属性值,用来检测数据类型。(10).constructor。返回number。Js习惯:先声明后读写,先赋值后运算。变量的作用域:1、局部变量都比全局变量的优先权高2、内部局部变量比外层局部变量优先权高3、变量都是对象的属性。全局变量是window对象的属性。第五章Delete如果删除内部对象的预定义成员和客户端对象成员,使用var语句申明的变量也是不允许删除的。可以删除不存在的变量,返回true。Delete操作是彻底删除所占用的存储空间。Void运算符的优先级、void的运算结果返回undefined。第七章函数的作用域。function和Function构造函数的作用域是不同的。Funtion有顶级作用域。而function是局部的。函数的解析机制Js解释器是一段段分析和执行程序的。在同一段代码中,function语句和函数直接量定义的函数结构总会被提取出来执行。只有当函数被解析和执行完毕之后,才会按顺序执行其它代码。但是Function构造函数定义的函数并非提前运行,而是在运行时动态地被执行。函数的接收值个数没有限制。函数的返回值只能有一个。若要返回多个数据,则用数组存储。函数的生命周期:使用function语句声明的函数被预先编译,此时如果存在相同的函数名,则会按顺序覆盖。而函数直接量和构造函数定义的函数都属于表达式函数,因此在代码按行执行时,才被激活生命周期。函数的形参通过length属性来获取。Arguments对象。参数管理器Arguments.length表示实参的个数。Arguments不是array对象,而是object对象,不能用for/in结构遍历。可以通过arguments[i]下标动态改变实参的值。也可以通过修改length动态增大或减小实参的个数。Arguments.Callee可以返回当前arugments对象所属的函数的引用,等价于函数名。Arguments.Callee.length表示函数形参的个数。This关键字Undefined+undefined=NaN。多个undefined相加会返回NaN。函数作用域和实例化函数this的作用域是不同的。实例化只值向当前函数的作用域,而函数调用对象的作用域则是window。函数属性的作用域:函数体外定于的属性可以任意的访问,可以在函数体内或外部访问,而函数内部定义的属性在初始化状态只能在函数体内部被调用。但若函数被调用后,则可以在外部访问函数内部定义的属性。若属性是函数,作用域也是一样的。Call和apply。Apply传递的是数组。1、Call和apply将函数转换成方法传递给某个对象,只是临时的,函数最终没有作为对象的方法存在,当函数被调用后,该对象方法会自动被注销。2、Call和apply避免了资源浪费。闭包:数据存储的一种方式。在动态环境中,数据实时变化,为了避免前面的数据丢失,js提供了闭包来寄存动态数据。特性:自闭特性。外界无法访问闭包结构内部的数据。包裹特性。第八章定义抽象对象的方法是通过构造函数来实现的。Push()会添加新元素后返回数组长度。创建对象时,存储在变量中的只是引用指针,并不是对象本身。删除变量后,对象本身依然存在。Js的垃圾回收机制,自动收集无用存储单元,不需要专门销毁无用对象以释放内存。当对象没有被任何变量引用时,js会自动侦测并把所有废除的对象注销。当我们把对象的所有引用变量都设置为null时,可以强制对象处于废除状态。并被回收。当删除对象属性后,不是将属性设为undefined,而是真正从内存清除掉。对象的作用域:Js仅支持一种作用域,即公共作用域。对于js所有对象的所有属性和方法来说都是公开的。Js对象的结构封闭性不如函数结构。函数有自己的私有作用域。外界是无法访问的。通过命名规则以区分私有作用域。O.x._a_=1;静态对象:static 声明。Math和Global都是静态对象。Js不支持静态作用域。构造对象:就是构造函数。如Object、Date、Function。构造对象的首字母要大写。构造对象不能直接被引用。必须使用new来实例化。alert(Point.name); //直接读取构造对象的属性alert(p1.name); //但是不能够通过实例对象来读取构造对象的属性 返回 undefined。这个name是构造对象在函数外定义的。如果是在函数内定义的则可以访问。对于构造对象的属性,实例对象是不能继承的,因此也不能够通过实例对象来读取构造对象的属性,反过来,构造对象也不能读取实例对象的属性。构造对象不能使用this关键字来读去实例对象的属性。function Point(x,y){ this.x = x; this.y = y;this.z = z;}Point.name = "类属性";Point.money = "1203";Point.saying = function(){ alert(this.length);//返回值2}Point.saying();var p = new Point();alert(p.name);// 实例对象不能访问构造对象的属性。抛错。function Point(x){ this.x = x;}Point.saying = function(){//构造对象的方法 alert("类方法");}Point.saying();//直接调用构造对象的方法Point.saying = function(){ alert(this.x);//不能通过this访问实例对象的属性}Point.saying();//直接调用构造对象的方法 返回undefined实例对象实例对象的属性有两种: 第一种:从构造对象中继承过来的,这种属性每一个实力属性都有,但是他们拥有不同的副本。第二种:自己创建的,这种属性只有这个实例对象所独有。原型对象就是构造函数的实例对象。它所包含的所有属性和方法能够供构造函数的所有实例共享。(类继承的实现),js叫原型继承。原型对象时在使用构造函数创建对象是同时实例化的一个对象,所有的对象都共同拥有这个对象的引用。通常我们在原型对象里面定义实例对象公用的方法,这样的好处是: 第一:所有的对象都共有这样一个方法实例,大大的节省的内存。第二: 当我们想修改对象的方法是,只用修改原型对象的方法既可以了,不用再麻烦的修改每一个实例的方法。如果原型属性和实例对象自定义的属性发生了命名冲突,则自定义的属性会“覆盖”原型属性的内容。这时由他的工作机制所决定的,但并不是真正的覆盖。如果我们删除这个属性,也是删除的实例的属性。当js解释器在检索属性时,会先检查对象实例是否定义该属性,没有,则会检查构造函数的原型对象是否具有这个属性。属性的继承只发生在读属性值时,而在写属性时不会发生。构造器构造器是在Object类中定义的属性,该属性始终指向对象的构造函数。对象的构造器属性是通过原型对象继承的,如果我们删除掉对象的原型,就可以看到他会自动查找到上一层的构造器属性。最终是要指向Ojbect的。对于js内置对象来说,由于它们的原型是只读的,用户无法修改,所以可以使用constructor属性来判断内置对象的数据类型。ToString ()、valueOf()方法。hasOwnPRoperty用来检测一个对象的属性是继承属性,还是私有属性。但是注意:如果是一个对象的继承属性则会返回false,但是对于这个对象的原型对象来说则会返回trueisPrototypeOf:判断一个对象的原形对象。函数的原型对象可以是Object.prototype,或者Function.prototype。Global对象。是抽象类。JavaScript规定所有的对象和函数都不能独立存在,换句话说,所有的函数都必须是某个对象的方法, 所有的对象都必须是某个类的子类。这就是全局对象,虽然是全局对象,但是global却没有方法调用全局的变量和方法。 这些方法却可以自己直接执行。所以global有点像名誉zhuxi。没有实际的操控权利。Date对象://获取本地系统的当前时间。var now = new Date();alert(now);//返回当前时间对象,如"Wed Apr 29 15 :37: 55 UTC +0800 2009 "//通过多选参数来创建指定的时间对象。此时,构造函数Date()的参数格式如下:new Date(year, month, day, hours, minutes, seconds, ms)//除了前两个参数外(年和月)外,其他所有参数都是可选的,其中月数参数从0开始,如0表示第1个月,11表示第12个月。var d1 = new Date(2009,4,1);alert(d1); //返回时间对象,如"Fri May 1 00: 00:00 UTC+ 0800 2009"var d2 = new Date(2009,4,1,5,30,30);alert(d2); //返回时间对象,如"Fri May 1 00: 00:00 UTC+ 0800 2009"//通过一个时间格式的字符串来创建指定的时间对象。此时,月份是从1开始,而不是从0开始。var d1 = new Date("2009/4/1 5:30:30");alert(d1); //返回时间对象,如"Wed Apr 1 05 :30: 30 UTC +0800 2009"//通过传递一个毫秒数来创建指定的时间对象。这个毫秒数是距离1970年1月1日午夜(GMT时间)的毫秒数。var d1 = new Date(1000000000000);alert(d1); //返回时间对象,如"Sun Sep 9 09 :46 :40 UTC +0800 2001"第九章 数组数组的定义有两种方法:1.使用new关键字,传入参数。2.使用数组直接量,在中括号中添加元素。建议使用第二种方法因为效率高一些。Js的数组的长度可以任意伸缩,可以存储任意类型的数据内容。数组的下标可以不连续。Js在初始化数组时,只有真正存储在数组中的元素才能够被分配到内存中。数组中的元素可以自由定义,例如如果只定义1和100则在内存中实际额只存在这两个元素。所以在JavaScript中数组是否按顺序并不是那么重要。Array.length返回的不是数组存储值的实际个数,而是当前数组的最大元素的个数。数组和对象的一个区别就是:数组使用的是下标和具体的值相关联,而对象中则使用的是特定的字符串。交换两个变量var a = 10, b = 20; //变量初始化//var temp = a; //定义临时变量存储a//a = b; //把b的值赋值给a//b = temp; //把临时变量的值赋值给ba = [b, b = a ][0]; //通过数组快速交换数据定义数组的基本方法: 第一步: 定义函数名,通过一个或表达式首先判断如果存在则直接使用如果不存在则定义。 第二步: 将第一的函数名付给Object,Array.prototype._sum = Array.prototype.sum ||//检测是否存在同名方法( Array.prototype.sum = function(){//定义该方法 var _n = 0; //临时汇总变量 for(var i in this){ //遍历当前数组对象 if( this[i] = parseFloat( this[i] ) ) _n += this[i]; //如果数组元素是数字,则进行累加 }; return _n; //返回累加的和});Object.prototype.sum = Array.prototype._sum//把数组临时原型方法赋值给对象的原型方法sum()var a = [1, 2, 3, 4, 5, 6, 7, 8, "9"];//定义数组直接量alert( a.sum() ); //返回45第十章字符串Js解释器采用了引用的方法实现对字符串的操作。字符串数据被存储到堆,然后把字符串的引用地址存储在字符串变量中。同时为了避免错误操作,js解释器强制约定字符串在堆存储的数据是不可变的。相当于设置字符串在堆区存储的数据是只读的。js对字符串的复制,传递操作,仅是简单的采用引用的方法,操作对象为堆区字符串的地址,即复制和传递地址。但是一旦编辑字符串本身的值,则js就会把堆区的字符串读取到棧区进行独立操作。字符串的比较是逐字节比较的。先把两个变量的字符串读取到栈区,然后逐字节比较,最后返回比较结果。字符串的操作是结合了值操作和引用操作的。当申明一个字符串时会把它的真实值存放在堆区,并且设定了堆区的内容是不可改变的,而在栈去存放堆区的地址。所以当进行复制和传递操作时只是进行了地址的传递,但是一旦要对字符串进行修改时则会复制一份放到栈区。实际是对栈区的内容进行改变,所以操作之后我们需要将这个值再次赋给引用,否则它会只是存放在栈区里,等待垃圾回收。对于字符串类型的语句或表达式,可以使用静态方法eval()来执行。var s = "alert('love')";eval(s);var s = new String();//创建一个空字符串对象,并赋值给变量s.object类型。var s = String( 123456 ); //包装字符串。String类型。var s = String( 1, 2, 3, 4, 5, 6 ); //带有多个参数,只处理第一个参数并把它转换为字符串返回。fromCharCode可以包含n个参数,参数代表字符的unicode编码。返回对应编码的字符的新字符串。var a = [35835, 32773, 24744, 22909], b = [];//声明一个字符编码的数组for( var i in a ){ //遍历数组 b.push( String.fromCharCode( a[i] ) ); //把每个字符编码都转换为字符串}alert( b ); //返回字符串"读,者,您,好"alert( b.join( "" ) ); //返回字符串"读者您好"第12章 BOMBOM:浏览器对象模型。Browser Object ModelBom对象包括:window,navigator,screen,history,location,document.Window代表根节点,其它对象是window的属性。它是全局作用域Window对象定义的3个人机交互方法:alert,confirm,prompt。var url = "http://www.css8.cn/";var features = "height=100, width=100, top=100, left=100,toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no";document.write('<a href="http://www.baidu.com/" target="newW" >切换到百度首页</a>');var me = window.open (url, "newW", features);setTimeout(function(){ me.close();},30000);使用write 方法时会覆盖掉前一个的内容。Location.search 捕获url查询字符串信息。第十三章 DOMwindow.onload = function(){var tag = document.getElementsByTagName("ul")[0];var a = tag.childNodes;//获取列表结果所包含的所有列表节点alert(a[0].nodeName);//显示第一个列表项的节点名称node.childNodes[0] = node.firstChild node.childNodes[node.childNodes.length-1] = node.lastChild}</scri
新闻热点
疑难解答