`

对[<<javascript征途>>-第四章]中一个结论错误的论证

 
阅读更多

[<<javascript征途>>-第四章 J存在这样的一句话【javaScript 解释器会在预编译期就把函数处理了,而对于匿名函数却视而不见,直到执行期才按表达式逐行进行解释。】

我认为该结论是错误的应该解释为

JavaScript 解释器会在预编译期就把函数处理了及变量声明处理,直到执行期才完成对变量的赋值及表达式的处理

并不是对匿名函数视而不见

  

示例

<script Language="JavaScript">
	 test();//1
	 function test(){
	 		alert( "test1" );
	 }
	  test();//2
	 function test(){
	 		alert( "test2" );
	 }
	  test();//3
</script>

 

按我们以前说的JavaScript是从上到下执行,这样理解的话1的话应该是报错,2的话应该为test1,3的话应该test2。

但实际上我们看到的结果三处都为test2。

为什么会这样呢

第一:JavaScript时按<script></script>编译,并执行的。

 第二:JavaScript编译时完成对变量的声明,及函数处理。

 第三:JavaScript后声明的函数将会覆盖前声明的函数

从上面三条我们可以看出在编译时 第二个test函数将覆盖第一test函数。当执行test时,对于<script>中只存在第二个test的定义,所以三处消息都为test2

     请看如下示例

<script Language="JavaScript">
	 test();//1
	 var test = function( ){
	 		alert( "test1" );
	 }
	  test();//2
	 function test(){
	 		alert( "test2" );
	 }
	  test();//3
</script>

   这样结果会是什么呢。

  结果可能也让你意外,1为test2,2为test1,3为test1。

  这个也可以用上面的第二条解释,对应变量test解释器只会完成相应的声明,而不会完成相应的赋值。所以test 的实际为第二函数test,这也是为什么1弹出test2,当代码执行到var test时,这个时候才完成对变量test赋 值,及将匿名函数赋值给test这样函数2和3为什么会是结果test1呢。

    各位看到这里也没说明<<javascript征途>>中理论的错误,不着急大家可以看如下示例

<script Language="JavaScript">
	 test();//1
	 var test1 = function test ( ){
	 		alert( "test1" );
	 }
	  test1();//2
	 function test(){
	 		alert( "test2" );
	 }
	  test();//3
</script>

 

各位想想test1()会是什么结果,按照<<javascript征途>>中的说明将有名函数test赋值给test1,并在解释阶段完成对test函数表达式的处理。

结果1为test2,2也为test2,3也为test2

但结果确与<<javascript征途>>结论的结果不一致,

真实的结果为 1为test2,2为test1,3为test2

第一个test函数并未在解释阶段完成处理,而是在执行阶段完成处理,并且不能覆盖解释阶段的test的函数定义。所以才有了如上结果。

 

以上是我个人的一点看法,对于JavaScript底层机制还不时挺熟悉,只能结合测试的代码说明这个问题。请各位大虾结合自己的看法发表下意见。

 

分享到:
评论
10 楼 dreams2018 2010-11-11  
获益匪浅,牛人真多!~
9 楼 hyj1254 2010-11-09  
还真是卧虎藏龙,牛人不要老潜水啊
8 楼 wangpeihu 2010-11-08  
都是高人啊。该书的作者在51js上争论的很激烈啊!不承认自己有问题,大家可以去搜一下,真是很激烈哦。
7 楼 stevensinclair 2010-11-06  
我想书的作者应该看到了吧  上来也讨论下子呢 哈哈
6 楼 mlw2000 2010-11-05  
好帖就应该是这样的
5 楼 takuma888 2010-11-05  
非常好的讨论,受益匪浅,特别是对es3的解读,感谢楼主和clue。
4 楼 80197675 2010-11-04  
<div class="quote_title">clue 写道</div>
<div class="quote_div">
<p>如果IE下能访问到非匿名函数表达式的Identifier,那表明IE对这种表达式(var a = function Fun(){})的解释执行与ECMAScript标准不符,这里找到了一篇文章非常详细地分析了这玩艺:</p>
<p><a href="http://kangax.github.com/nfe/">Named function expressions demystified</a> (JScript bugs讲述了IE的bug)</p>
<p> </p>
<p>摘选这篇分析的结果:</p>
<p>IE下,所有function xxx(){}这类表达式,都会进行预定义(与标准严重不符,包括赋值语句及其它块中的也处理了)</p>
<p>如果按ECMA标准应该算是FunctionExpression的带Identifier的函数语句,IE即当声明又当表达式,并且执行双份:</p>
<pre name="code" class="js">var a = function b(){
   alert("test");
};
// 按标准,此处应出错,因为b未定义。
alert(a === b); // IE下为false... IE sucks</pre>
<p> 它可以看作类似于以下代码:</p>
<pre name="code" class="js">function b(){
   alert("test");
}
var a = function(){
   alert("test");
};
alert(a === b);</pre>
 
<p> </p>
<p>对此。。。我的看法是:这些东西太低层了,各个浏览器差异还真不小,理解就好了,不用太过于专注。</p>
<p>尽量不要用带名称的函数表达式,函数声明放在最外层。</p>
<p> </p>
<p>最后再来一句: IE sucks</p>
</div>
<p><br>  clue 你也太厉害呢,全是英文材料,膜拜中!!!!!!!!!!!!!!!!!!!!!</p>
<p>  现在在整理JavaScript,发现很多的概念【很多的概念在网上解释的也不正确】及代码书写模式以前都没见过。</p>
<p>  以后有问题向clue请教。</p>
3 楼 clue 2010-11-04  
<div class="quote_title">80197675 写道</div>
<div class="quote_div">
<p>很感谢clue的解释</p>
<p>尤其对于函数表达式及函数定义概念和对于函数表达式作用域链的解释。</p>
<p>不过一下代码在IE与Firefox存在差异,</p>
<pre name="code" class="js">&lt;script Language="JavaScript"&gt;
var test1 = function test ( ){
alert( "test1" );
}
alert( test );
  test();
         window.test();
&lt;/script&gt;</pre>
<p> 这个代码在IE中并未提示错误,alert() 与test函数,window.test(),运行正常,</p>
<p>在Firefox存在错误也就是未定义。</p>
<p>我在IE下调试的这样一直以为test作用域处于widow下,所以对于</p>
<pre name="code" class="js">test(); // statement 1
var test1 = function test ( ){
alert( "test1" );
}; // statement 2
test1();//statement 3
function test(){
alert( "test2" );
} // declaration
test();//statement 4</pre>
<p>
这个的执行结果有点迷惑,尤其《JavaScript征途》那句话的更让我迷惑。</p>
<p>看到clue的解释尤其英文中关于函数表达式的作用域的说明才让我明白。</p>
<p> </p>
</div>
<p>如果IE下能访问到非匿名函数表达式的Identifier,那表明IE对这种表达式(var a = function Fun(){})的解释执行与ECMAScript标准不符,这里找到了一篇文章非常详细地分析了这玩艺:</p>
<p><a href="http://kangax.github.com/nfe/">Named function expressions demystified</a> (JScript bugs讲述了IE的bug)</p>
<p> </p>
<p>摘选这篇分析的结果:</p>
<p>IE下,所有function xxx(){}这类表达式,都会进行预定义(与标准严重不符,包括赋值语句及其它块中的也处理了)</p>
<p>如果按ECMA标准应该算是FunctionExpression的带Identifier的函数语句,IE即当声明又当表达式,并且执行双份:</p>
<pre name="code" class="js">var a = function b(){
   alert("test");
};
// 按标准,此处应出错,因为b未定义。
alert(a === b); // IE下为false... IE sucks</pre>
<p> 它可以看作类似于以下代码:</p>
<pre name="code" class="js">function b(){
   alert("test");
}
var a = function(){
   alert("test");
};
alert(a === b);</pre>
 
<p> </p>
<p>对此。。。我的看法是:这些东西太低层了,各个浏览器差异还真不小,理解就好了,不用太过于专注。</p>
<p>尽量不要用带名称的函数表达式,函数声明放在最外层。</p>
<p> </p>
<p>最后再来一句: IE sucks</p>
2 楼 80197675 2010-11-04  
<div class="quote_title">clue 写道</div>
<div class="quote_div">翻了翻ECMAScript edition3 (<img src="/images/smiles/icon_confused.gif" alt=""> 发现这玩艺越读越深,每次都有小惊喜……)<br><br><strong>函数定义有两类,函数声明与函数表达式:</strong><br>FunctionDeclaration : <br>   function Identifier ( FormalParameterList<span style="font-size: xx-small;">opt</span> ) { FunctionBody } <br>FunctionExpression : <br>   function Identifier<span style="font-size: xx-small;">opt</span> ( FormalParameterList<span style="font-size: xx-small;">opt</span> ) { FunctionBody } <br><br><span style="text-decoration: underline;">可以看到, function A(){} 与 var a = function A(){}是完全不同的,一个是声明,一个是表达式。</span><br>(而与var a = function(){}的区别请看附1)<br><br><strong>而JS程序的组成为:</strong><br>Program : <br>   SourceElements <br>SourceElements : <br>   SourceElement <br>   SourceElements SourceElement <br>SourceElement : <br>   Statement <br>   FunctionDeclaration <br><br><strong>执行过程为:</strong><br>1. Process SourceElements for function declarations. <br>2. Evaluate SourceElements. <br>3. Return Result(2). <br><br>即:先处理函数声明,再处理代码。<br>var a = function A(){}不属于函数声明,它属于函数表达式(FunctionExpression)<br><br><span style="font-size: large;">so, 现在回到那句有争议的话,<strong>它的问题在于这两点</strong>:<br>1. "javaScript 解释器会在预编译期就把<span style="color: red;">函数</span>处理了"  --&gt;  应为"函数声明"<br>2. 漏掉了既非函数声明,也非匿名函数的表达式: var a = function A(){}</span><br><br><br>------------------------------------<br><strong>附1</strong>:<br>var a = function A(){} 这类函数表达式的解释执行过程<br>它并不是函数声明,试试这段代码就知道了:<br>var a = function Fun(){};<br>alert(Fun); // 会报错,并无Fun这个变量<br><br>ECMA中描述的解释执行过程:<br>The production  FunctionExpression  :  function  Identifier  ( FormalParameterList<span style="font-size: xx-small;">opt</span>  )  {  FunctionBody  } is evaluated as follows: <br>1.  Create a new object as if by the expression new Object(). <br>2.  Add Result(1) to the front of the scope chain. <br>3.  Create a new Function object as specified in section 13.2 with parameters specified by FormalParameterListopt <br>and body specified by FunctionBody. Pass in the scope chain of the running execution context as the Scope. <br>4.  Create a property in the object Result(1). The property's name is Identifier, value is Result(3), and attributes are <br>{ DontDelete, ReadOnly }. <br>5.  Remove Result(1) from the front of the scope chain. <br>6. Return Result(3). <br>看起来头晕么?我也是到今天才突然明白过来,简单转述一下:<br>它与不带Identifier的函数表达式的区别在于,1,2,4,5步,临时将scope chain增加了一层(有点类似with语句),只不过这一层是空白对象,然后将Identifier定义在这层scope上。<br>然后,这个函数存储的[[scope]]能访问到自身的Identifier。<br>最后,创建函数完毕后,又将增加的这层scope移掉了,对外界来说,这段代码和没有Identifier一样,但对函数内部来说,它能通过Identifier访问自身。<br><br>模拟执行:<br><pre name="code" class="js">test(); // statement 1
var test1 = function test ( ){
alert( "test1" );
}; // statement 2
test1();//statement 3
function test(){
alert( "test2" );
} // declaration
test();//statement 4
</pre>
<br>1. 初始状态<br>scope chain: {global:[]}<br>2. 处理函数声明<br>scope chain: {global:[test1:undefined, test:function(){alert("test2")}]}<br>3. 执行第一句<br>scope chain: 同上<br>运行global.test // test2<br>4. 执行第二句{<br>   1. 新增对象插入到scope chain<br>   scope chain: {empty_object:[]}  -&gt; {global:[test1:undefined, test:function(){alert("test2")}]}<br>   2. 创建函数,以F来称呼它<br>   F.[[scope]] = {empty_object:[]}  -&gt; {global:...}<br>   3. 在4.1步中新增的对象上增加test属性<br>   F.[[scope]] = {empty_object:[test:function(){alert("test1")}]}  -&gt; {global:...}<br>   scope chain: 同上<br>   4. 从scope chain中移除4.1插入的对象<br>   scope chain: {global: ...}<br>},并赋值给test1<br>scope chain: {global:[test1:function(){alert("test1")}, test:function(){alert("test2")}]}<br>5. 第三句<br>运行global.test1 // test1<br>6. 第四句<br>运行global.test // test2<br><br><strong>以上分析涉及到了scope chain相关知识,不懂的请自行查阅资料(google, ECMAScript)</strong>
</div>
<p> </p>
<p>很感谢clue的解释</p>
<p>尤其对于函数表达式及函数定义概念和对于函数表达式作用域链的解释。</p>
<p>不过一下代码在IE与Firefox存在差异,</p>
<pre name="code" class="js">&lt;script Language="JavaScript"&gt;
var test1 = function test ( ){
alert( "test1" );
}
alert( test );
  test();
         window.test();
&lt;/script&gt;</pre>
<p> 这个代码在IE中并未提示错误,alert() 与test函数,window.test(),运行正常,</p>
<p>在Firefox存在错误也就是未定义。</p>
<p>我在IE下调试的这样一直以为test作用域处于widow下,所以对于</p>
<pre name="code" class="js">test(); // statement 1
var test1 = function test ( ){
alert( "test1" );
}; // statement 2
test1();//statement 3
function test(){
alert( "test2" );
} // declaration
test();//statement 4</pre>
<p>
这个的执行结果有点迷惑,尤其《JavaScript征途》那句话的更让我迷惑。</p>
<p>看到clue的解释尤其英文中关于函数表达式的作用域的说明才让我明白。</p>
<p> </p>
1 楼 clue 2010-11-04  
翻了翻ECMAScript edition3 ( 发现这玩艺越读越深,每次都有小惊喜……)

函数定义有两类,函数声明与函数表达式:
FunctionDeclaration :
   function Identifier ( FormalParameterListopt ) { FunctionBody }
FunctionExpression :
   function Identifieropt ( FormalParameterListopt ) { FunctionBody }

可以看到, function A(){} 与 var a = function A(){}是完全不同的,一个是声明,一个是表达式。
(而与var a = function(){}的区别请看附1)

而JS程序的组成为:(附2有分析如何区分声明与表达式)
Program :
   SourceElements
SourceElements :
   SourceElement
   SourceElements SourceElement
SourceElement :
   Statement
   FunctionDeclaration

执行过程为:
1. Process SourceElements for function declarations.
2. Evaluate SourceElements.
3. Return Result(2).

即:先处理函数声明,再处理代码。
var a = function A(){}不属于函数声明,它属于函数表达式(FunctionExpression)

so, 现在回到那句有争议的话,它的问题在于这两点
1. "javaScript 解释器会在预编译期就把函数处理了"  -->  应为"函数声明"
2. 漏掉了既非函数声明,也非匿名函数的表达式: var a = function A(){}



------------------------------------
附1
var a = function A(){} 这类函数表达式的解释执行过程
它并不是函数声明,试试这段代码就知道了:
var a = function Fun(){};
alert(Fun); // 会报错,并无Fun这个变量

ECMA中描述的解释执行过程:
The production  FunctionExpression  :  function  Identifier  ( FormalParameterListopt  )  {  FunctionBody  } is evaluated as follows:
1.  Create a new object as if by the expression new Object().
2.  Add Result(1) to the front of the scope chain.
3.  Create a new Function object as specified in section 13.2 with parameters specified by FormalParameterListopt
and body specified by FunctionBody. Pass in the scope chain of the running execution context as the Scope.
4.  Create a property in the object Result(1). The property's name is Identifier, value is Result(3), and attributes are
{ DontDelete, ReadOnly }.
5.  Remove Result(1) from the front of the scope chain.
6. Return Result(3).
看起来头晕么?我也是到今天才突然明白过来,简单转述一下:
它与不带Identifier的函数表达式的区别在于,1,2,4,5步,临时将scope chain增加了一层(有点类似with语句),只不过这一层是空白对象,然后将Identifier定义在这层scope上。(注:ECMAScript 3rd中是说new Object(),这使得它会受Object.prototype影响,会产生很多问题,很多浏览器并没按这个来做。ECMAScript 5th中已经改掉了)
然后,这个函数存储的[[scope]]能访问到自身的Identifier。
最后,创建函数完毕后,又将增加的这层scope移掉了,对外界来说,这段代码和没有Identifier一样,但对函数内部来说,它能通过Identifier访问自身。

模拟执行:
test(); // statement 1
var test1 = function test ( ){
	alert( "test1" );
}; // statement 2
test1();//statement 3
function test(){
	alert( "test2" );
} // declaration
test();//statement 4

1. 初始状态
scope chain: {global:[]}
2. 处理函数声明
scope chain: {global:[test1:undefined, test:function(){alert("test2")}]}
3. 执行第一句
scope chain: 同上
运行global.test // test2
4. 执行第二句{
   1. 新增对象插入到scope chain
   scope chain: {empty_object:[]}  -> {global:[test1:undefined, test:function(){alert("test2")}]}
   2. 创建函数,以F来称呼它
   F.[[scope]] = {empty_object:[]}  -> {global:...}
   3. 在4.1步中新增的对象上增加test属性
   F.[[scope]] = {empty_object:[test:function(){alert("test1")}]}  -> {global:...}
   scope chain: 同上
   4. 从scope chain中移除4.1插入的对象
   scope chain: {global: ...}
},并赋值给test1
scope chain: {global:[test1:function(){alert("test1")}, test:function(){alert("test2")}]}
5. 第三句
运行global.test1 // test1
6. 第四句
运行global.test // test2

附2
由上面的文法定义得知,程序(或函数体)内容为SourceElements,内含多个并行的SourceElement。
而一个SourceElement由语句(Statement)或函数声明(FunctionDeclaration)组成
注意!再往下没有FunctionDeclaration的递归了,也就是说,只有在程序或函数体根层(因为是并列的SourceElement,没有包含)才算是FunctionDeclaration。
也就是说,如果在if块或其它块中的function xxx(){},并不算是声明,只是表达式罢了。
当然。。。IE总是出人意料,更详细资料看这里:
http://kangax.github.com/nfe/

以上分析涉及到了scope chain相关知识,不懂的请自行查阅资料(google, ECMAScript)

相关推荐

    超链接(文本超链接、图像超链接)

    -- &lt;a href=""&gt;&lt;/a&gt; --&gt;超链接标签(用于从一个页面链接到另一个页面) &lt;br&gt; 文本超链接 &lt;br&gt; &lt;a href="https://www.baidu.com/"&gt;百度&lt;/a&gt; &lt;div&gt; &lt;!-- &lt;a href=" 不写值 "&gt;百度&lt;/a&gt; --&gt;空链接 &lt;br&gt; &lt;a href=""&gt;&lt;/...

    select多选下拉列表+模糊查询功能.rar

    &lt;!DOCTYPE html&gt; ...&lt;option value=""&gt;----量表四----&lt;/option&gt; &lt;/select&gt; &lt;script type="text/javascript"&gt; $(function(){ $("#table_id").comboSelect(); }); &lt;/script&gt; &lt;/body&gt; &lt;/html&gt;

    总结了一些asp.net 经常需要用到的一些方法和类

    --------------调用javascript的类&lt;br&gt;Log----------------------写系统日志类&lt;br&gt;OperateFile--------------文件操作的类&lt;br&gt;SortTip------------------排序提示的类&lt;br&gt;Paging-------------------数据库分页的类...

    JavaScript做的滑动菜单menu

    &lt;br/&gt;//-----常规变量---&lt;br/&gt;//-----菜单项目---&lt;br/&gt;//-----插入菜单---&lt;br/&gt;//-----程序初试化---&lt;br/&gt;//-----单击超连接---&lt;br/&gt;//-----滑动处理---&lt;br/&gt;//-----滑出---&lt;br/&gt;//-----绝对定位---&lt;br/&gt;//-----关于...

    asp.net中常用到的类和方法(v 1.2)

    首先,感谢大家的支持,之前上传的第一个版本首到好多网友的关注,因为太贵了,所以给大家带来许多不便,大家都没舍得花着呢多分,所以都EMai过来了,我也没有时间一一回复,所以在此再发布一个新的版本,供大家下载&lt;br&gt;此...

    【JavaScript源代码】JavaScript实现限时秒杀功能.docx

    DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;meta charset="utf-8"&gt; &lt;title&gt;&lt;/title&gt; &lt;/head&gt; &lt;body&gt; &lt;div class="box"&gt; &lt;div id="d"&gt;&lt;/div&gt; &lt;!-- 剩余的天数 --&gt; &lt;div id="h"&gt;&lt;/div&gt; &lt;!-- 剩余的小时 --&gt; &lt;div id="m...

    D3.JS 基于javascript的图表展示库<三>----基本元素绑定

    D3.JS 基于javascript的图表展示库&lt;三&gt;----基本元素绑定 所对应的源码

    JavaScript

    JavaScript程序构成&lt;br&gt;4-基于对象的JavaScript语言&lt;br&gt;5-在JavaScript中创建新对象&lt;br&gt;6-JavaScript对象系统的使用&lt;br&gt;7-JavaScript窗口及输入输出&lt;br&gt;8-用JavaScript脚本实现Web页面信息交互&lt;br&gt;9-用JavaScript...

    JavaScript学习教程

    Windows特性 &lt;br&gt; JavaScript文件目标模块 &lt;br&gt; 状态条的操作 &lt;br&gt; 窗口间的交流 &lt;br&gt; 再谈JavaScript DOM &lt;br&gt; 窗口的其它特性 &lt;br&gt; 再谈Window及Frame树杈结构 &lt;br&gt; 自己动手操作 &lt;br&gt; 第三天复习 &lt;br&gt; 第四课 ...

    D3.JS 基于javascript的图表展示库<四>----基本元素选择与Table

    D3.JS 基于javascript的图表展示库&lt;四&gt;----基本元素选择与Table 见博客http://blog.csdn.net/a6383277/article/details/8742906

    C# 语法参考

    &lt;br/&gt;&lt;br/&gt;C.1 词法&lt;br/&gt;input:(输入:) &lt;br/&gt;input-sectionopt(输入节可选) &lt;br/&gt;input-section:(输入节:) &lt;br/&gt;input-section-part(输入节部分)&lt;br/&gt;input-section input-section-part(输入节 输入节...

    网页教程代码参考

    &lt;br&gt;HTML&lt;br&gt;HTML教程&lt;br&gt;&lt;br&gt;HTML代码示例&lt;br&gt;&lt;br&gt;HTML参考(Reference)&lt;br&gt;&lt;br&gt;HTML知识库&lt;br&gt;&lt;br&gt;CSS&lt;br&gt;CSS教程&lt;br&gt;&lt;br&gt;CSS代码示例&lt;br&gt;&lt;br&gt;CSS参考(Reference)&lt;br&gt;&lt;br&gt;Javascript&lt;br&gt;Javascript教程&lt;br&gt;&lt;br&gt;...

    javascrip上百技术总集

    asp .net Label控件&lt;br&gt;用javascript操作 asp .net TextBox控件 下&lt;br&gt;用javascript操作asp.net label控件 外一篇&lt;br&gt;用javascript改变onclick调用的函数&lt;br&gt;用JavaScript加密保护网站页面&lt;br&gt;用Javascript检测网速...

    DOM Scripting

    书名:&lt;br&gt;---------------------------------&lt;br&gt;DOM Scripting Web Design with JavaScript and the Document Object Model&lt;br&gt;---------------------------------&lt;br&gt;语言:English&lt;br&gt;格式:PDF&lt;br&gt;打包:WinRAR

    在线订餐系统基于Javawen

    &lt;option value="0"&gt;---请选择---&lt;/option&gt; &lt;option value="club"&gt;会员&lt;/option&gt; &lt;option value="admin"&gt;管理员&lt;/option&gt; &lt;/select&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;input type="submit" value="登录" onclick=...

    <<JavaScript DOM 高级程序设计>> 一书的配套源代码

    &lt;&lt;JavaScript DOM 高级程序设计&gt;&gt; 一书的配套源代码,涵盖了书中的代码例子.

    非常好的html+css+js网页设计项目资源,分享出来.zip

    下面主要由LOGO、导航栏组成。通过a标签超链接组成,鼠标划过会有颜色变化,导航栏用无序列表ul更方便简洁。... &lt;div class="box"&gt; &lt;!... &lt;p id="shij"&gt;&lt;/p&gt; &lt;!--获取当前时间--&gt; &lt;/div&gt; &lt;/div&gt; &lt;div ...

    《JavaScript程序设计基础教程》 课件

    &lt;br&gt;第二章 HTML制作 &lt;br&gt;第三章 JAVASCRIPT编程基础 &lt;br&gt;第四章 流程控制 &lt;br&gt;第五章 函数 &lt;br&gt;第六章 对象编程 &lt;br&gt;第七章 文档对象模型与事件驱动 &lt;br&gt;第八章 使用浏览器对象 &lt;br&gt;第九章 级联样式表(CSS)技术 &lt;br...

    AjaxAnyWhere中文帮助文档.pdf

    第四步:修改web.xml,添加AAFilter 过滤器。 修改部署描述文件web.xml,在该文件中添加AAFilter 过滤器。映射部分的部署代码如例程11-22 所示。 例程11-22 web.xml 添加AAFilter 过滤器 &lt;filter&gt; &lt;filter-name&gt;...

    菜单修改版

    -- 以下一个ul对应上面的一个li,例如javascript对应下面第一个ul --&gt; &lt;ul&gt; &lt;li&gt;王中帅,Ajax,Other&lt;/li&gt; &lt;li&gt;基础,Swing,Applet,More&lt;/li&gt; &lt;li&gt;Spring,Habernate,Struct&lt;/li&gt; &lt;li&gt;HTMl,CSS,SCRIPT&lt;/li&gt; &lt;li&gt;...

Global site tag (gtag.js) - Google Analytics