资源描述
Javascript心得
1.正则表达式:
(1)
RegExp(".*tid=(\\d*).*","g");
匹配数字用RegExp全局对象时,用\\d而不是\d,其他的应该也是用两个\
(2)
RegExp.$1用一次之后就失效了,例如:
alert(RegExp.$1);
var tid=RegExp.$1; //tid将得不到任何内容
2.获取鼠标位置:
tSendMail.onclick = function(pE) {
pE = pE || window.event;
var x=0;
var y=0;
if(pE.pageX || pE.pageY){
x=pE.pageX;
y=pE.pageY;
}else{
x=pE.clientX + document.body.scrollLeft + document.body.clientLeft;
y=pE.clientY + document.documentElement.scrollTop + document.body.clientTop;
}
注意标红的那部分,当html文档在头部添加了w3c的标准后,document.body.scrollTop失效,应该使用 document.documentElement.scrollTop
3.关于几个函数:
(1)getElementsByName: 返回的是数组
(2)setAttribute('',''):调用这个函数之后,对于div来说,name属性ff下可以通过 getElementsByName获得,但是IE却无法获得;另外,定义一个容器的class,使用 setAttribute('className','')而不是setAttribute('class',''),同样是因为IE不支持。
4.关于max-width属性,IE6及其以下的版本不支持max-width,一下为替代方法:
<!--[if lt IE 7]>
<style type="text/css" media="screen">
p img { width: expression(this.width > 450 ? "100%" : true); }
</style>
<![endif]-->
<!--[if IE]-->
5.关于firefox3.5的img标签onerror事件:firefox3.5对于img标签中src为空的情况不会触发onerror事件(IE,firefox2,3均可以),只好把src设一个不存在的地址,就可以触发了。
以下均出自《javascript权威指南》第四版
6. javascript中如果语句分别放置在不同的行,就可以省去分号(所以某一行没有加分号,也不报错)
7. javascript中的变量命名,第一个字符必须是字母、下划线或美元符号,接下来跌字符可以是字母、数字或下划线、美元符号,数字不允许作为首字符出现。
8. javascript中的对象可以作为关联数组使用。因为它们能够将任意的数据值和任意的字符串关联起来例如:img.length=img[‘length’]。
9. 虽然undefined和null值不同,但是==运算符却将两者看作相等,如果必须区分,可以使用===或typeof。
10. 使用var多次声明同一个变量不仅是合法的,而且也不会造成任何错误。
11. 隐式声明(未声明直接赋值)的变量总是被创建为全局变量,即使该变量只在一个函数体内使用。
12. 没有块级作用域,函数中声明的所有变量,无论是在哪里声明的,在整个函数中他们都是有定义的:
var scope = “global”;
function f(){
alert(scope); //显示”undefined”,而不是”global”
var scope = “local”;
alert(scope); //显示”local”
}
13. 基本类型:数值,布尔值,null,未定义的值(undefined) - 固定大小
引用类型:对象,数组,函数 – 不固定大小
14. 在Javascript中,由于所有的数字都是浮点型的,所以除法的结果也都是浮点型;
15. 如果函数不包含return语句,他就只执行函数体中的每条语句后返回给调用者Undefined;
16. 如果传递的参数比函数需要的个数多,多余的值会被忽略掉,如果少,则会被赋予undefined;
17. 在一个函数体内,标识符arguments具有特殊含义,是调用对象的一个特殊属性,它类似数组(实际上是Arguments对象),能够按照数字获取传递给函数的参数值,arguments[]允许存取函数参数,arguments.length表示参数个数;
18. 除了数组元素,Arguments对象还定义了callee属性,用来引用当前正在执行的函数,这对未命名的函数调用自身非常有用:
function(x) {
if(x<=1) return 1;
return x*arguments.callee(x-1);
}
<第八章 对象>
19. for/in循环枚举对象属性:
function DisplayPropertyNames(obj){
var names=””;
for(var name in obj)
names+=name+”\n”;
alert(names);
}
20. 关于原型对象(prototype):javascript的对象都继承原型对象的属性,每个对象都有原型对象,继承实在查询一个属性值时自动发生的,例如在读对象o的属性p时,首先检查o是否具有一个名为p的属性,则再检查o的原型对象是否具有这个属性;由于一个原型对象能够被多个对象继承(类似类成员,静态成员),因此存在着读写不对称性(有可能读到的是原型的属性,写的却是对象自身的属性);
21. toString()方法的目的是每个对象类都有自己特定的字符串表示,所以应该定义一个合适的toString()方法将对象转换成相应的字符串形式:Obj.prototype.toString=function (){…}
<第九章 数组>
22. 在javascript中,数据第一个元素的下标是0。
23. 在javascript中,数组是稀疏的,数组的下标不会落在一个连续的数字范围内,只有那些真正存储在数组中的元素才能够分配的内存。如a[0]=1;a[1000]=1; javascript解释器只给数组下标为0和1000的元素分配内存,但是如果用a.length取数组的长度,那么长度是1001而不是2.
24. 通过设置数组的length属性来阶段数组是唯一一种缩短数组长度的方法。
25. Array.slice(from,end)返回数组从from开始的元素到end的前一个元素,即从array[from]到array[end-1]。
26.unshift()和shift()和push()与pop()相似,只不过都是在数组的头操作,即在数组的第一个元素处操作,由于在操作的同时需要移动数组元素的位置,不知道效率是不是比push()和pop()低。
<第十章 使用正则表达式的模式匹配>
27. 重复字符可以匹配尽可能多的字符,而且允许接下来的正则表达式继续匹配,因此我们说重复是“贪婪的”。可以以非贪婪方式进行重复,只需要在重复字符后加问号即可。例如,正则表达式/a+/匹配一个或多个字符a,应用在“aaa”上时,匹配三个字母,但是/a+?/只匹配一个或多个必要的字母a,因此只匹配“a”。
28. 关于模式g,对于RegExp对象,当一个具有g标志的正则表达式调用exec()时,他将把该对象的lastIndex属性设置到紧接着匹配子串的字符位置。当同一个RegExp对象第二次调用exec()时,它将从lastIndex属性所指示的字符处开始检索。如果exec()没有发现任何匹配,它会将lastIndex属性重置为0。
<第十一章 JavaScript的更多主题>
29. 运算符+,<,<=,>,>=即能用于数字,又能做作用于字符串,当这些运算符用于对象时,大多数情况下,javascript会先尝试调用对象的valueOf()方法对他进行转换,如果该方法返回了原始值,就使用那个值,但是valueOf()通常返回的都是未被转换的对象,在这种情况下,Javascript将调用对象的toString()方法对他进行转换。
30. 要把一个值转换成字符串,可以把它连接到一个空串上:
var x_as_string = x + “”;
要把一个值强制转换成数字,就用它减0:
var x_as_number = x – 0;
要把一个值强制转换成布尔值,需要连用两次”!”运算符:
var x_as_boolean = !!x;
31. Number对象的toString(x)方法可以将数字转换成x进制。
<第十二章 客户端JavaScript>
<第十三章 Web浏览器中的Javascript>
32. 如果编写了一个并不产生任何文档输出的脚本,可以使用<script>标签中的defer属性来提示浏览器这样做是安全的:继续解析HTML文档并延迟脚本的执行,直到遇到一个无法延迟的脚本。
33. 关于</script>标记,浏览器不会理解javascript代码,因此要在javascript里写</script>时,要么拆分字符串,要么做转义:
document.write(“</”+”script>”);
document.write(“<\/script>”);
34. 关于onload: 当注册了多个onload句柄的时候,浏览器调用所有的句柄,但是,调用他们的顺序并不能保证;由于onload时间在文档完全解析之后调用,他们不能调用document.write,如果调用的话则会重新打开一个文档并且覆盖掉当前的文档,而不是在当前文档后面添加内容;
35. 关于onunload:窗口关闭时会调用(刷新时也会调用)
<第14章 脚本化浏览器窗口>
36. 关于location对象:
location.href: url
location.protocol: 协议(:前的部分,比如http, file等等)
location.host: 主机名
location.pathname: 主机名后,参数前
location.search: get参数
37. setTimeout和clearTimeout,使用setTimeout返回值作为clearTimeout的参数,可以使setTimeout失效
38. URL解码:decodeURIComponent
URL编码:encodeURIComponent
39. 书上提到“不要混淆Window对象的location属性和Document对象的location属性,前者引用一个Locatioin对象,而后者只是一个只读字符串,并不具有Location对象的任何特性。但是alert(window.location===document.location);结果是true,不知道为什么……
似乎document.location也是一个对象!
40. 关于坐标:
outerWidth: 浏览器窗口的宽度
outerHeight: 浏览器窗口的高度
screenX: 浏览器窗口相对于桌面的横坐标距离
screenY: 浏览器窗口相对于桌面的纵坐标距离
innerWidth: HTML文档的宽度
innerHeight: HTML文档的高度
pageXOffset: 滚动条的横坐标
pageYOffset: 滚动条的纵坐标
41. 关于访问变量:在做测试的时候发现,js遇到“xxx is not undefined“错误时会停止脚本的运行,但是如果加上一个window对象,以访问window对象的属性时就不会出现一个脚本错误停止运行,只是返回一个”undefined”对象。
42. 关于Navigator对象的属性:
appName: 浏览器的简单名称
appVersion: 浏览器的版本号和(或)其他版本信息
userAgent: 浏览器在他的USER-AGENT HTTP头部发送的字符串,一般包含appName和appVersion中的所有信息
appcodeName: 浏览器的代码名,Netscape用代码名“Mozilla“作为这一属性的值,为了兼容,IE也采用这种方式
platform: 运行浏览器的代码名
43. 遍历一个对象属性的方法(以遍历Navigator方法为例):
for(var propname in navigator){
browser+=propname +":"+navigator[propname]+"\n";
}
44. 打开一个新窗口,关闭,检测是否关闭:
var w=window.open("","test",
"widht=400,height=350,status=yes,resizable=yes",true);//打开新窗口
w.close();//关闭
alert(w.closed);//检测是否关闭,关闭返回true,否则返回false
《第15章 脚本化文档》
45. 如果两个DOM具有相同的name属性,那么document.somename就变成保存了这两个元素引用的一个数组。
46. HTML不区分大小写,例如onMouseover
47. DOM树结构表现为不同种类的Node对象的一棵树,Node接口订了一遍历和操作树的属性和方法。Node对象的childNodes属性返回节点的孩子的一个列表,并且firstChild,lastChild,nextSibling,previousSibling和parentNode属性提供了遍历节点的树的一种方法。像appendChild(),removeChild(),replaceChild()和insertBefore()这样的方法能够向一个文档树中添加节点或者从一个文档树中移除节点。
48. 常见的节点类型:
接口 nodeType常量 nodeType值
Element(html, i) NODE.ELEMENT_NODE 1
Text(文本串) NODE.TEXT_NODE 3
Document(dom树根)NODE.DOCUMENT_NODE 9
Comment NODE.COMMENT_NODE 8
DocumentFragment NODE.DOCUMENT_FRAGMENT_NODE 11
Attr NODE.ATTRIBUTE_NODE 2
49. 用Element接口的getAttribute()方法、setAttribute()方法和removeAttribute()方法可以查询,设置并删除一个元素的属性。
50. dom属性class对应javascript中的className。
《第16章 层叠样式表和动态HTML》
51. 关于position:
static: 根据文档内容定位
absolute: 绝对定位,相对于<body>标记定位
fixed: 总是可见,不随文档其余的元素滚动(IE6不支持)
relative: 根据上层元素定位
52. 关于visibility和display,如果visibility设置了hidden,会为该元素预留大小,但是display不会。
53. 关于padding和margin:以前一直不知道这两个有什么区别,设置了一下border才明白……padding是相对于border的“内边距”,margin是border相对于父元素的“外边距”
《16.3脚本化内联工具》
54. Javascript中的CSS属性,css样式属性的名字中有连字符,对应javascript中会被误解为减号,因此一般改为连字符,且原来紧接在连字符后的字母改写为大写
《第17章 事件和事件处理》
55. javascript事件模型:
原始事件模型(DOM 0):用HTML属性设置事件处理代码,如onclick。事件是浏览器内部提取的,,javascript代码不能直接操作事件。
标准事件模型(DOM 2):使用addEventListener()方法为时间注册句柄
IE事件模型:中间模型,介于原始事件模型和标准事件模型之间。
56. 当事件句柄被调用时,它是作为产生事件的元素的方法调用的,所以关键字this引用了那个目标元素。
57. javascript事件传播:事件传播分三个阶段进行,第一,在捕捉(capture)阶段,事件从Document对象沿着文档树下下传播给目标节点。如果目标的任何一个祖先专门注册了捕捉事件句柄,那么在事件传播的过程中,就会运行这些句柄;事件传播的下一个阶段发生在目标节点本身,直接注册在目标上的适合的事件句柄将运行;事件传播的第三个阶段是起泡(bubbling)阶段,在这个阶段,时间将从目标元素向上传播回或起泡回Document对象的文档层次。
58. addEventListener(event, handle, capture_boolean) 其中第三个参数表示是否要在事件捕捉的阶段触发,我的理解一般是在起泡的过程触发事件,如果设置为true,有可能父节点的事件先触发,如果调用两次该函数,分别设置为true和false,则事件会调用两次(捕捉阶段和冒泡阶段均会触发)
59. 所有知名的实现都是用addEventListener()来调用句柄注册,就好像他们是目标元素的方法一样,也就是说,this关键字所引用的对象正是在其上注册了这个句柄的对象。如果不希望依赖于这种不确定的行为,可以使用传递给句柄的Event对象的属性currentTarget。
59. Event接口定义了两个方法:stopPropagation()和preventDefault(),preventDefault()方法组织浏览器执行与事件相关的默认动作。
60. IE的Event对象并不是作为函数参数,而是作为Window对象的属性,IE模型支持起泡形式的事件传播,但不支持DOM模型的捕捉形式的事件传播。
61. attachEvent(event, handle): 传递给IE方法的时间句柄名字前应当有个“on“,关键字this引用的是Window对象,允许同一事件句柄函数注册多次,当指定类型的一个事件发生时,注册函数被调用的次数和他被注册的次数一样多。
《17.4鼠标事件》
62.按键事件:有3中按键事件,分别是keydown、keypress和keyup,他们分别对应onkeydown、onkeypress和onkeyup这几个事件句柄,一个典型的按键会产生所有这3种事件,义次是keydown、keypress,然后是按键释放时候的keyup。如果一个按键被按下并自动重复,可能是在keydown和keyup之间有多个keypress事件,但是这和操作系统击浏览器相关,而不能想当然。
63.按键事件中的键盘码:firefox定义了两个属性,keycode存储了一个按键的较低层次的虚拟按键码,并且和keydown事件一起发送,charcode存储了按下一个键时所产生的可打印的字符的编码,并且和keypress事件一起发送。在IE中,只有一个keycode属性,并且它的解释也取决于时间的类型,对于keydown事件来说,keycode是一个虚拟按键码,对于keypress事件来说,keycode是一个字符码。
64.调用表单的submit()方法不会触发onsubmit事件。
65.可以用<button>标记代替传统的<input>标记创建包括Submit和Reset在内的按钮,<button>标记更灵活一些,因为他不显示由value属性指定的纯文本,而是现实出现在<button>和</button>之间的html内容。
<第19章 cookie和客户端持久性>
66.cookie值不能含有分号、逗号或空白符,因此需要使用核心javascript的全局函数encodeURIComponent()把值存入cookie之前对他编码。
67.发现一个有意思的函数:prompt(‘pleas fill the blank’,’’);可以出来一个对话框,填写内容,这个函数的返回值就是填写的内容;第一个参数表示提示语,第二个参数为默认输入框中的内容。
《javascript权威指南》到此结束
=======================================================================
68.关于javascript的回调函数顺序
今天使用getjson函数,遇到一个郁闷的问题,下面是一个简单的示例
function aa(){
var v;
$.getJSON(url,function(json){
v=json.name;
//alert(‘after ajax: ‘+v); 1
});
//alert(‘before return: “+v); 2
return v;
}
var u=aa();
alert(‘after return: ‘+u); 3
在ff3.5下执行顺序是:1,2,3(大部分情况下)或者2,3,1
在IE下执行顺序必然是:2,3,1
最后问了陈sir,才明白是怎么回事,javascript的回调函数执行顺序与函数外层执行顺序是不确定的,也就是说有可能回调函数还没执行,就已经return了,尤其是IE比较明显,因此如果要对回调函数的数据进行处理,那一定要把全部工作都在回调函数里进行,而不要把回调函数的结果再传给别的函数进行处理,否则会出现意想不到的结果。
69. 阻止事件冒泡
function stopBubble(e)
{
if (e && e.stopPropagation)
e.stopPropagation()
else
window.event.cancelBubble=true
}
《javascript高级程序设计》第2版
70.<script>标签中language属性已废弃,大多数浏览器会忽略这个标签。
71.如果是在xhtml中,可以省略</script>标签。
72.在代码中使用保留字作为标识符在大多数浏览器中都会导致“Identifier Expected”(缺少标识符)的错误。
73.直接使用未定义的变量会导致一个错误,但是可以使用typeof返回undefined。
74.使用typeof检测null会返回object。
75.undefined值是派生自null值的,因此他们的相等性测试返回true。
《3.5操作符》
76.无符号右移操作符由3个大于号(>>>)表示。
77.对于加法操作符,如果有一个操作数是字符串,则将另一个操作数转换为字符串,然后将两个字符串拼接起来:
var result = 5 + ‘5’; //result = ‘55’;
78.with: with语句的作用是将代码的作用域设置到一个特定的对象中:
var qs = location.search.substring(1);
等同于:
With(location){
Var qs = search.substring(1);
}
使用with语句关联了location对象,意味着在with语句的代码块内部,每个变量首先被认为是一个局部变量,而如果在局部环境中找不到该变量的定义,就会查询location对象中是否有同名的属性。
79.函数参数不限制数量和类型,因为函数参数在内部是以数组形式表示的。另外,没有引用传递参数的方式。
80.不能给基本类型的值添加属性,尽管不会导致任何错误:
var name=’sfsdfsd’;
name.age = 27;
alert(age); //undefined
81.当从一个变量向另一个变量复制引用类型的值时,复制的只是指针。
82.在safari和chrome中使用typeof检测正则表达式时,这个操作符会错误的也返回“function”
83.javascript没有块级作用域,即在if语句或for语句中定义的局部变量,在if或for块的外面:
if(true){
var color=’blue’;
}
alert(color); //’blue’
84.声明变量:在使用var关键字声明变量时,这个变量将被自动添加到距离最近的可用环境中,对函数而言,就是函数的局部环境;如果变量在未经声明的情况下被初始化,那么该变量会被自动添加到全局环境:
function add(num1, num2){
var sum = num1+num2;
return sum;
}
var result = add(10, 20);
alert(sum); //undefined
function add(num1, num2){
sum = num1+num2;
return sum;
}
var result = add(10, 20);
alert(sum); //30
《4.3 垃圾收集》
85.javascript中的垃圾收集机制主要有两种:标记清除和引用计数。引用计数方式存在循环引用的问题。大部分浏览器采用的是标记清楚,IE由于其DOM使用COM组件实现的,而COM组件的垃圾收集机制是引用计数,因此IE对于DOM采用的是引用计数的垃圾回收。
86.IE6的垃圾收集器是根据内存分配量运行的,具体一点说就是256个变量,4096个对象字面量和数组元素或者64KB的字符串,达到上述任何一个临界值,垃圾收集器就会运行。如果一个脚本中包含那么多变量,那么该脚本很可能会在其生命周期中一直保有那么多的变量,这样垃圾收集器就不得不频繁运行,由此引发的性能问题导致IE7重写了其垃圾收集器。
87.数组定义:
var a=[1,2,]
在IE中定义了三个值,在其他浏览器是两个值。
88.javascript解析器会率先读取函数声明,并使其在执行任何代码之前可用,至于函数表达式,必须等到解析器执行到它所在的代码行才会真正被解释执行:
alert(sum(1,2));
function sum(num1,num2){
return num1+num2;
}
alert(sum(1,2)); //错误
var sum = function(num1,num2){return num1+num2};
89.函数的this属性:this引用的是函数据以执行操作的对象(谁在调用函数),如果在全局范围内调用函数,则this指的是window,如果某个对象调用则this指的是这个对象。
90.函数具有两个内部方法:apply()和call(),这两个方法的第一个参数是作用域对象,可以以此来扩充函数的作用域。
《5.6 基本包装类型》
91.基本包装类型:有三种特殊的引用类型Boolean, Number和String, 每当读取一个基本类型值时,后台就会创建一个对应的基本包装类型的对象,从而让我们能够调用一些方法来操作这些数据:
var s1=”som text”;
var s2 = s1.substring(2);
第二行代码访问s1时,访问过程处于一种读取模式,从内存中读取这个字符串的值,后台会完成下列处理:
(1) 创建String类型的一个实例
(2) 在实例上调用指定的方法
(3) 销毁这个实例
由于自动创建的基本包装类型的对象只存在于一行代码执行的瞬间,然后立即销毁,所以不能在运行时为基本类型添加属性和方法;
var s1=’some text’;
s1.color = ‘red’;
alert(s1.color); //undefined
92.IE不支持用方括号加数字索引的方式获取字符串中的字符:
var a=’some text’;
alert(a[1]);//IE:undefined, firefox:o
93.URI编码:encodeURI()用于对整个URI编码,encodeURIComponent()用于对URI中的某一段编码。URI:uniform resource identifier
94.Math.random()方法:返回介于0和1之间的一个随机数,不包括0和1。
95.函数声明和函数表达式的区别:前者会在代码执行以前被加载到作用域,后者是在代码执行到那一行时才会有定义。
96.javascript没有块级作用域,从来不会告诉你是否多次声明了统一变量,遇到这种情况,他会对后续的声明视而不见。
function func(){
for(var i=0;i++;i<10){
alert(i);
}
var i; //不会报错
alert(i); //10
97.递归函数应该始终使用arguments.callee来递归的调用自身,不要使用函数名-函数名可能发生变化。
《8.2 location对象》
98.关于UA:Netscape Navigator 3发布后不久,微软也发布了其第一款赢得用户广泛认可的web浏览器,即Internet Explorer 3。由于Netscape浏览器在当时占绝对市场份额,许多服务器在提供网页之前都要专门检测该浏览器。如果用户通过IE打不开相关网页,那么这个新生的浏览器很可能就会夭折,于是,微软决定将IE的用户代理字符串修改为Netscape形式,结果如下:Mozilla/2.0 (compatible; MSIE 版本号;操作系统)
(Mozilla: 美国NCSA(Natinal Center for Supercomputing Application,国家超级计算中心)发布了世界第一款Web浏览器Mosaic,Mozilla含义是Mosaic Killer)
99.关于document.domain:document.domain可以设置,但只能设置本域且只能向下设置,例如原domain是,新domain可以是,但不能设置为,当设置为之后,不能再设置为。非法设置均会抛出异常。
100.关于document.getElementById:在IE下,如果有哪个表单元素的name特性等于指定的ID,而且该元素在文档中位于带给定ID的元素前面,那么IE就会返回哪个表单元素:
<input name=’mydiv’ value=’sdfsdfdsf’/>
<div id=’mydiv’ ></div>
document.getElementById(‘mydiv’)获取的元素是input而不是div
《第11章 DOM2和DOM3》
101.offsetLeft/offsetWidth/offsetTop/offsetHeight为加上边框(margin)的元素大小,clientWidth/clientHeight为去掉边框(margin)的元素大小
102.
scrollHeigth:在没有滚动条的情况下,元素内容的总高度;
scrollWidth:在没有滚动条的情况下,元素内容的总宽度;
scrollTop:被隐藏在内容区域上方的像素数,通过设置这个属性可以改变元素的滚动位置;
scrollLeft:被隐藏在内容区域左侧的像素数,通过设置这个属性可以改变元素的滚动位置;
103.
clientX:鼠标指针在浏览器中的水平位置;
clientY:鼠标指针在浏览器中的垂直位置;
screenX:鼠标指针相对于电脑屏幕的水平位置;
screenY:鼠标指针相对于电脑屏幕的垂直位置;
104.相关元素:在发生mouseover和mouseout事件时,会涉及多个元素,DOM通过对象的relatedTarget属性提供了相关元素的信息,这个属性只对于mouseover和mouseout事件才包含值,对于其他事件,这个属性的值是null,IE不支持relatedTarget属性,但提供了保存着同样信息的不同属性,当mouseover事件触发时,IE的fromElement属性保存了相关元素,在mouseout事件触发时,IE的toElement属性保存了相关元素。
105.由于javascript是松散类型的,而且不会验证函数的参数,因此错误只会在代码运行期间出现,一般来说,需要关注3种错误:
类型转换错误:注意验证函数参数的类型
数据类型错误:尤其在使用对象方法时,要验证数据的类型
通信错误:注意URL编码
106.关于json数据定义:虽然javascript不要求给对象的属性加引号,单位加引号的属性在JSON中被视为一个语法错误。
107.使用函数表达式时,this指针指的是windows对象,使用函数定义式时,this指的是函数对象。
108.惰性载入:表示函数执行的分支仅会发生1次,即函数第一次调用的时候,示例:
非惰性:
function createXHR(){
if(typeof XMLHttpRequest!=’undefined’){
return new XMLHttpRequesyt();
}else if(….){
return new xxxx();
}else{
return new xxxxxx();
}
}
惰性:
function createXHR(){
if(typeof XMLHttpRequest!=’undefined’){
createXHR = function(){
return new XMLHttpRequest();
};
}else if(….){
createXHR = function(){
return new xxxx();
};
}else{
createXHR = function(){
return new xxxxxx();
};
}
return createXHR();
}
109.函数绑定:函数绑定要创建一个函数,可以在特定环境中已指定参数调用另一个函数。
110.javascript是运行于单线程的环境中的,而定时器仅仅只是计划代码在未来的某个执行时间,执行时机是不能保证的,因为在页面的生命周期中,不同时间可能有其他代码在控制javascript进程。
111.除了主javascript执行进程外,还有一个需要在进程下一次空闲时执行的代码队列,随着页面在其生命周期中的推移,代
展开阅读全文