这里主要是JS的基础知识,也是深入理解Ext的基础。1.参数可变长,注意跟Java还是有一点区别的。例:viewsource 这里主要是JS的基础知识,也是深入理解Ext的基础。1.参数可变长,注意跟
这里主要是JS的基础知识,也是深入理解Ext的基础。1.参数可变长,注意跟Java还是有一点区别的。例:viewsource
这里主要是JS的基础知识,也是深入理解Ext的基础。1.参数可变长,注意跟Java还是有一点区别的。例:
view source print ? 1. functiongetUser(name,age){ 2. alert("name: "+name +" age: "+age); 3. }
调用方法:getUser(); // 可以不传参数getUser("cat"); // 可以只传递一个参数getUser("cat",20); // 传两个参数getUser("cat",20,2,"dog"); // 传两个以上的参数2.不给函数定义形参,直接在函数中使用arguments属性获取实际传递的参数数组。例: view source print ? 1. functiongetUser(){ 2. varargs = arguments; 3. alert(args.length); 4. alert(args[0]); 5. } 3.js函数不能重载.因为,JS函数的参数是可变长的,从代码意义上来说就没有重载。另外,JS是一种解释执行的语言,浏览器脚本引擎开始载入JS代码的时候,必须先“扫描”然后才开始解释执行。在这个过程中,有一个重要的操作就是“标识符解析”,要求同一命名空间不允许同名变量的存在,包括函数名。例: view source print ? 1. functiongetUser(){ 2. alert("hello!"); 3. } 4. functiongetUser(name){ 5. alert("sorry!"); 6. } 7. getUser();// 结果永远是 sorry! 4.命名空间:Java我们用package edu.ouc.wy来定义,JS中则需要我们一层一层的定义。 view source print ? 1. varedu = {}; 2. varedu.ouc = {}; 3. varedu.ouc.wy = {}; 5.JS支持函数嵌套例: view source print ? 1. functionouterFn(){ 2. functioninnerFn(){ 3. alert("innerFn test.."); 4. } 5. alert("outerFn test..."); 6. } 7. outerFn();// 结果弹出来两个窗口 6.既然有了函数嵌套,我们就有从outerFn外部调用innerFn函数的需求例: view source print ? 1. functionouterFn(){ 2. functioninnerFn(){ 3. alert("innerFn test.."); 4. } 5. returninnerFn(); 6. } 7. varcacheFn = outerFn(); 8. cacheFn(); 一般来说,“外层”作用域中的代码是无法访问“内层”作用域的。但是通过return一个函数的方式,可以让函数“穿越”作用域的限制,从而让外层作用域能够“触摸”到“内层”的函数和变量。例: view source print ? 01. varouterName ="cat"; 02. functionouterFn(){ 03. varname ="dog"; 04. functioninnerFn(){ 05. alert("outername: "+outerName +" innername: "+name); 06. } 07. returninnerFn; 08. } 09. varcacheFn = outerFn(); 10. cacheFn();// 结果为 outername: cat innername: dog 7.JS中函数既是数据例: view source print ? 1. functiontestFn(){ 2. alert("test function.."); 3. } 4. alert(testFn);// 显示的结果和上面这三行是一样的 例: view source print ? 1. testFn =function(){ 2. alert("test function.."); 3. } 4. alert(testFn);// 效果和上一个例子是一样的 两者的不同是:前者直接声明了一个函数,在脚本引擎的解析期间,这个函数就会被创建。而后者相当于是定义了一个变量,因此只有在脚本真正执行到这一行的时候,函数才会被构建出来。8.函数作为对象的属性,动态的添加和删除例: view source print ? 1. varobj = {}; 2. obj.testFn =function(){ 3. alert("test func.."); 4. } 5. obj.testFn();// 括号()的目的是让testFn这个属性(函数)执行 6. deleteobj.testFn; 7. obj.testFn();// 报错 9.函数也是对象,也有自己的类:Function例1: view source print ? 1. vartestFn =newFunction('name','alert(my func...)'); 2. testFn();// 结果 my func... Function:可以接受任意多个参数,只有最后一个参数被当做“函数体”。使用new Function()方式创建的函数,是在运行时才创建。并且他的作用域是“顶级作用域”,即window例: view source print ? 1. functionouterFn(){ 2. varname ="cat"; 3. varinnerFn =newFunction("alert(name)"); 4. returninnerFn; 5. } 6. varcacheFn = outerFn(); 7. cacheFn();// 结果报错,因为在window作用域中,找不到name变量 例2: view source print ? 1. varmyFn =function(){} 2. myFn.name ="cat"; 3. alert(myFn.name);// cat 4. deletemyFn.name; 5. alert(myFn.name);// 空 10.三种特殊形式的函数调用:call,apply,()例: view source print ? 1. functionmyFn(){ 2. alert(this.name); 3. } 4. myFn.call({name:"cat"});// 结果为cat 5. myFn.apply({name:"dog"});// 结果为dog 结果很奇怪:两次this.name居然不一样。这就是JS是动态语言的意义所在,不要被Java思想所束缚。对于JS来说,函数中的this并不一定指向特定的对象,它是可变的。(这句很重要)call和apply都能执行函数并给this传递参数。两者相同点:他们都可以接受两个参数,第一个参数为函数中this需要绑定的对象。不同点:call的第二个参数是可变长参数,apply的第二个参数是数组。例: view source print ? 1. functionmyFn(a,b){ 2. returna+b; 3. } 4. myFn.call({},1,2); 5. myFn.apply({},[1,2]); 6. 例:(function(){ 7. alert("my func.."); 8. })(); 结果这个函数自己就执行了。11.我们知道了函数也是对象。也用过了arguments这个原生属性。JS为函数对象提供了很多原生的属性,包括arguments,callee,caller,length,prototype等例1: view source print ? 01. functionmyFn(){ 02. vars =""; 03. varlen = arguments.length; 04. for(vari=0; i 例2: view source print ? 1. functionfact(n){// n的阶乘 2. if(n==1){ 3. return1; 4. }else{ 5. returnn * arguments.callee(n-1); 6. } 7. } callee在arguments属性中定义,并且它指向函数自己,可以用于递归调用。例3: view source print ? 1. functionworker(){ 2. alert(worker.caller);// 将会输出boss函数的代码,因为没有给他加(), 3. // 否则将报错too much recursion 4. } 5. functionboss(){ 6. worker(); 7. } 8. boss(); 原文链接:http://extjs.org.cn/node/585