zoukankan      html  css  js  c++  java
  • Extjs 基础篇—— Function基础

    这里主要是JS的基础知识,也是深入理解Ext的基础。
    1.参数可变长,注意跟Java还是有一点区别的。
    例:

    1.function getUser(name,age){
    2.alert("name: "+name + " age: "+age);
    3.}


    调用方法:getUser(); // 可以不传参数
    getUser("cat"); // 可以只传递一个参数
    getUser("cat",20); // 传两个参数
    getUser("cat",20,2,"dog"); // 传两个以上的参数
    2.不给函数定义形参,直接在函数中使用arguments属性获取实际传递的参数数组。
    例:

    1.function getUser(){
    2.var args = arguments;
    3.alert(args.length);
    4.alert(args[0]);
    5.}


    3.js函数不能重载.因为,JS函数的参数是可变长的,从代码意义上来说就没有重载。另外,JS是一种解释执行的语言,浏览器脚本引擎开始载入JS代码的时候,必须先“扫描”然后才开始解释执行。在这个过程中,有一个重要的操作就是“标识符解析”,要求同一命名空间不允许同名变量的存在,包括函数名。
    例:

    1.function getUser(){
    2.alert("hello!");
    3.}
    4.function getUser(name){
    5.alert("sorry!");
    6.}
    7.getUser(); // 结果永远是 sorry!


    4.命名空间:Java我们用package edu.ouc.wy来定义,JS中则需要我们一层一层的定义。

    1.var edu = {};
    2.var edu.ouc = {};
    3.var edu.ouc.wy = {};


    5.JS支持函数嵌套
    例:

    1.function outerFn(){
    2.function innerFn(){
    3.alert("innerFn test..");
    4.}
    5.alert("outerFn test...");
    6.}
    7.outerFn();  // 结果弹出来两个窗口


    6.既然有了函数嵌套,我们就有从outerFn外部调用innerFn函数的需求
    例:

    1.function outerFn(){
    2.function innerFn(){
    3.alert("innerFn test..");
    4.}
    5.return innerFn();
    6.}
    7.var cacheFn = outerFn();
    8.cacheFn();


    一般来说,“外层”作用域中的代码是无法访问“内层”作用域的。但是通过return一个函数的方式,可以让函数“穿越”作用域的限制,从而让外层作用域能够“触摸”到“内层”的函数和变量。
    例:

    01.var outerName = "cat";
    02.function outerFn(){
    03.var name = "dog";
    04.function innerFn(){
    05.alert("outername: "+outerName + " innername: "+name);
    06.}
    07.return innerFn;
    08.}
    09.var cacheFn = outerFn();
    10.cacheFn(); // 结果为 outername: cat innername: dog


    7.JS中函数既是数据
    例:

    1.function testFn(){
    2.alert("test function..");
    3.}
    4.alert(testFn); // 显示的结果和上面这三行是一样的


    例:

    1.testFn = function(){
    2.alert("test function..");
    3.}
    4.alert(testFn); // 效果和上一个例子是一样的


    两者的不同是:前者直接声明了一个函数,在脚本引擎的解析期间,这个函数就会被创建。
    而后者相当于是定义了一个变量,因此只有在脚本真正执行到这一行的时候,函数才会被构建出来。
    8.函数作为对象的属性,动态的添加和删除
    例:

    1.var obj = {};
    2.obj.testFn = function(){
    3.alert("test func..");
    4.}
    5.obj.testFn(); // 括号()的目的是让testFn这个属性(函数)执行
    6.delete obj.testFn;
    7.obj.testFn(); // 报错


    9.函数也是对象,也有自己的类:Function
    例1:

    1.var testFn = new Function('name','alert(my func...)');
    2.testFn();  // 结果 my func...


    Function:可以接受任意多个参数,只有最后一个参数被当做“函数体”。使用new Function()方式创建的函数,是在运行时才创建。并且他的作用域是“顶级作用域”,即window
    例:

    1.function outerFn(){
    2.var name = "cat";
    3.var innerFn = new Function("alert(name)");
    4.return innerFn;
    5.}
    6.var cacheFn = outerFn();
    7.cacheFn();  // 结果报错,因为在window作用域中,找不到name变量


    例2:

    1.var myFn = function(){}
    2.myFn.name = "cat";
    3.alert(myFn.name); // cat
    4.delete myFn.name;
    5.alert(myFn.name); // 空


    10.三种特殊形式的函数调用:call,apply,()
    例:

    1.function myFn(){
    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的第二个参数是数组。
    例:

    1.function myFn(a,b){
    2.return a+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:

    01.function myFn(){
    02.var s = "";
    03.var len = arguments.length;
    04.for(var i=0; i<len; i++){
    05.s += arguments[i]; // 注意arguments不是数组,而是对象
    06.}
    07.alert(s);
    08.}
    09.myFn(1,2,3,4,5);


    例2:

    1.function fact(n){ // n的阶乘
    2.if(n==1){
    3.return 1;
    4.}else{
    5.return n * arguments.callee(n-1);
    6.}
    7.}


    callee在arguments属性中定义,并且它指向函数自己,可以用于递归调用。
    例3:

    1.function worker(){
    2.alert(worker.caller); // 将会输出boss函数的代码,因为没有给他加(),
    3.// 否则将报错too much recursion
    4.}
    5.function boss(){
    6.worker();
    7.}
    8.boss();
    原文链接:http://extjs.org.cn/node/585
  • 相关阅读:
    Objective-C实用类和协议
    KVC(Key-Value-Coding)和KVO(Key-Value-Observer)
    Xcode
    IOS模拟器
    沙盒机制
    UIScrollView
    NSPredicate
    输入控件适应键盘
    10步成为专业iOS开发者——新手向,从零起步
    2015 年五大移动端设计趋势
  • 原文地址:https://www.cnblogs.com/1175429393wljblog/p/8794210.html
Copyright © 2011-2022 走看看