考点:语义化标签知识以及模块化HTML代码知识;
对话练习
二、请简化下面的CSS代码:a)margin:0px;b)padding:10px010px0;c)border-width:1px;border-style:solid;border-color:#ff5500;
考点:CSS的优化
margin:0;padding:10px0;border:1pxsolid#ff5500;
三、请看以下代码,按照下面的要求回答
if(window.addEventListener){varfn=function(type,fn,useCapture){el.addEventListener(type,fn,useCapture);}}elseif(window.attachEvent){fn=function(type,fn){el.attachEvent('on'+type,);}}考点:对事件绑定的深入理解a)以上代码的作用b)以上代码的优点c)以上代码中的问题,如果你有更好的,请把它编写出来
functionbind(el,type,fn,useCapture){if(window.addEventListener){el.addEventListener(type,function(){fn.apply(el,arguments);//始终将this指向DOM},useCapture);}elseif(window.attachEvent){el.attachEvent('on'+type,function(){fn.apply(el,arguments);//始终将this指向DOM});}}varel=document.getElementById('demo');vartest=function(){alert(this.nodeName);}bind(el,'click',test);注意代码中的注释部分。因为在符合DOM标准的浏览器中,addEventListener方法将把this指针指向绑定的函数,而IE中attachEvent方法将始终指向widow对象,为了将this指针始终指向当前绑定事件的DOM,我们必须要使用apply或者call方法来改变函数的作用域。
三、请计算下面变量的值
vara=(Math.PI++);varb=(Math.PI++);alert(a);alert(b);
两个都是3.1415626536。
参考文献:
vara=(++Math.PI);alert(a);//1alert(Math.PI);//2varb=(Math.PI++);alert(b);//3alert(Math.PI);//4varc=Math.PI=(++Math.PI);alert(c);//5alert(Math.PI);//6vard=Math.PI=(Math.PI++);alert(d);//7alert(Math.PI);//8vare=Math.PI=(Math.PI+1);alert(e);//9alert(Math.PI);//10
Math.PI在其他语言看来是系统一个常量,修改它的话编译都通不过,不过javascript具有很强的的容错性(包容性?),他是不会提醒你的,要搞懂这个不看规范是不行的。
分析
ECMAScript262:
PI
15.8.1.6PIThenumbervalueforπ,theratioofthecircumferenceofacircletoitsdiameter,whichisapproximately3.1415926535897932.Thispropertyhastheattributes{DontEnum,DontDelete,ReadOnly}.
只有系统属性才会有readonly,我们定义的一般属性没法设置,而ReadOnly应该相当于常量了吧?
ReadOnly
8.6.1ReadOnlyThepropertyisaread-onlyproperty.AttemptsbyECMAScriptcodetowritetothepropertywillbeignored.(Note,however,thatinsomecasesthevalueofapropertywiththeReadOnlyattributemaychangeovertimebecauseofactionstakenbythehostenvironment;therefore“ReadOnly”doesnotmean“constantandunchanging”!)
看见一般情况下,readonly属性不可以改,但不报错,即赋值修改没用!也不意味着是常量!
那么现在知道了:2,4,6,8,10条代码alert都是3.14了。
另外3alert也不用解释了,返回自增前结果,还是3.14
那么1alert难道还是3.14,因为PIreadonly无法改变?错误
自增运算符
涉及到前缀自增运算符的返回值问题:
11.4.4PrefixIncrementOperatorTheproductionUnaryExpression:
++UnaryExpressionisevaluatedasfollows:1.EvaluateUnaryExpression.
2.CallGetValue(Result(1)).
3.CallToNumber(Result(2)).
4.Addthevalue1toResult(3),usingthesamerulesasforthe+operator(see11.6.3).
5.CallPutValue(Result(1),Result(4)).6.ReturnResult(4).
则可见返回的是Result(4)Math.PI+1,而不是第五步过后的Result(1)
那么可见1alert即为Math.PI+1=4.14
赋值操作符
c,d,e类似,=操作符具有右结合性,则申明初始化时,变量值为赋值表达式(Math.PI=++Math.PI),javascript每个表达式都会返回一个值,这就涉及到了前句的表达式返回值是多少:
11.13.1SimpleAssignment(=)
TheproductionAssignmentExpression:LeftHandSideExpression=AssignmentExpressionisevaluatedasfollows:1.EvaluateLeftHandSideExpression.
2.EvaluateAssignmentExpression.
3.CallGetValue(Result(2)).
4.CallPutValue(Result(1),Result(3)).5.ReturnResult(3).
前面自增规范可以得到++Math.PI返回4.14为Result2,Result3,同样的道理,第4步赋值后,返回的是赋值表达式右端的值(++Math.PI),而不是左端的值Math.PI,则(Math.PI=++Math.PI)返回++Math.PI==4.14,即连续赋值运算只返回最右边的值,而不管赋值中变量是否发生了变化。
四、注释的代码是否可以实现?如不能实现,请修改
functiontest(){this.name='taobao';this.waitMes=function(){//隔5秒钟执行this.name}}考点:javascript闭包
functiontest(){this.name='taobao';varwaitMes=function(){//每隔5秒钟执行this.namesetTimeout(function(){alert(self.name)},5000);}returnwaitMes;}var_test=test();_test();