zoukankan      html  css  js  c++  java
  • JavaScript快速入门-ECMAScript函数

    JavaScript函数(定义、参数、返回值、闭包、匿名函数)

    一、函数定义

    function functionName(arg0, arg1, ... argN) {
      statements
    }

    函数是一组可以随时随地运行的语句。

    函数是 ECMAScript 的核心。

    函数是由这样的方式进行声明的:关键字 function、函数名、一组参数,以及置于括号中的待执行代码。

      

    二、参数

    普通参数:形参

    特殊参数:arguments。类似python里面的sys.argv。同样有arguments.lenght,表示参数个数。

        function func1(){
            if(arguments[0]=='test'){
                alert('haha');
    
            }else{
                alert('gaga');
            }
        }
        func1('test');
    

     

    三、返回值

    除非明确指定返回值(return ***),否则返回值为undefined,同时返回空(return;)也是undefined。 

      function sayHi(sMessage) {
          if (sMessage == "bye") {
            return sMessage;  #如果参数等于‘bye’,则返回bye。否则返回undefined。
          }
        }
    var a = sayHi('aaa');
    alert(a);
    

      

    四、函数对象

    在了解匿名函数前,需要了解一下函数对象。

    var function_name = new function(arg1, arg2, ..., argN, function_body)
    

      

    即函数的另外一种定义方式,通过声明函数的方式进行定义。其实,函数也是一种对象。

    上面的函数我们也可以这样定义:

    var sayHi = new Function("sName", "sMessage", "alert("Hello " + sName + sMessage);");
    

      注意:前面N个参数,最后面是函数体。这种形式写起来有些困难,但有助于理解函数只不过是一种引用类型,它们的行为与用 Function 类明确创建的函数行为是相同的。

    函数对象的属性:

    • length

    函数对象的方法:

    •  valueOf() 方法
    • toString() 方法

    五、匿名函数

    我们在python里面学习了lambda函数(匿名函数),比如定义:a=lambda x,y: x+y  调用:print a(1,3).

    在JavaScript中基本上类似。

    定义:

    //1、 匿名函数-普通定义,无参数
          var func = function(){
            return ‘aaa’
        }
        alert(func());
    
    
    //2、 匿名函数直接调用-无参数
        (function(){
            alert("tony");
        } )()
    
    //3、匿名函数直接调用-有参数
        (function(arg){
            console.log(arg);
        })('123')
    

      

    六、作用域

    作用域(基础知识)

     在学习闭包之前,我们需要先了解JavaScript的作用域。几乎所有的编程语言都有作用域的概念,简单的说,作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。

    作用域五句话原则:

    1、JavaScript中无块级作用域

    function Main(){
        if(1==1){
            var name = 'test';
        }
        console.log(name);
    }
    // 输出: test。在函数内查找。
    

      

    2、JavaScript采用函数作用域

    在JavaScript中每个函数作为一个作用域,在外部无法访问内部作用域中的变量。

    function Main(){
        var innerValue = 'test';
    }
     
    Main();
     
    console.log(innerValue);#作用域在函数内,函数外没定义,无法找到。
     
    // 报错:Uncaught ReferenceError: innerValue is not defined
    

      

    3、JavaScript的作用域链

    由于JavaScript中的每个函数作为一个作用域,如果出现函数嵌套函数,则就会出现作用域链。

    xo = 'xxoo';//全局变量,global
      
    function Func(){
        var xo = "ooxx";//函数内的局部变量,exeternal
        function inner(){
            var xo = 'xxxx';//函数内的局部变量,local
            console.log(xo);
        }
        inner();
    }
    Func();
    

      

    如上述代码则出现三个作用域组成的作用域链,如果出现作用域链后,那么寻找变量时候就会出现顺序,对于上述实例:

    当执行console.log(xo)时,其寻找顺序为根据作用域链从内到外的优先级寻找,如果内层没有就逐步向上找,直到没找到抛出异常。

    类似Python中的LEGB原则,首先会在local(本地)查找=>然后会到external(外部)查找=>再会查找global(全局)查找=>最后到build-in(内建)查找。进行链式查找!

    4、JavaScript的作用域链执行前已创建

    JavaScript的作用域在被执行之前已经创建,日后再去执行时只需要按照作用域链去寻找即可。

    由于JavaScript是先加载完,再调用。当所有命名空间加载完成后,最后去查找,所以作用域链在执行前就已经创建好了。

    5、JavaScript声明提前

    在JavaScript中如果不创建变量,直接去使用,则报错:

    console.log(xxoo);
    // 报错:Uncaught ReferenceError: xxoo is not defined
    

      

    function Foo(){
        console.log(xo);
        var xo = 'xxoo';
    }
     
    Foo();
    // 输出:undefined
    

      上述代码,不报错而是输出 undefined,其原因是:JavaScript的函数在被执行之前,会将其中的变量全部声明,而不赋值。所以,相当于上述实例中,函数在“预编译”时,已经执行了var xo;所以上述代码中输出的是undefined。

    七、闭包

    作用域搞清楚后,理解闭包就非常简单了。

    var city = 'beijing';
    
    function func(){
        var city = "shanghai";
        function inner(){
            // var city = "langfang";
            console.log(city);
        }
        return inner;
    }
    var ret = func();
    ret(); #shanghai
    

      

  • 相关阅读:
    Codeforces 627A XOR Equation(思路)
    Codeforces 633C Spy Syndrome 2(DP + Trie树)
    BZOJ 1982 [Spoj 2021]Moving Pebbles(博弈论)
    BZOJ 3676 [Apio2014]回文串(回文树)
    BZOJ 3790 神奇项链(manacher+DP+树状数组)
    Codeforces 449D Jzzhu and Numbers(高维前缀和)
    SPOJ Time Limit Exceeded(高维前缀和)
    BZOJ 4031 [HEOI2015]小Z的房间(Matrix-Tree定理)
    BZOJ 3809 Gty的二逼妹子序列(莫队+分块)
    BZOJ 3544 [ONTAK2010]Creative Accounting(set)
  • 原文地址:https://www.cnblogs.com/skyflask/p/9027347.html
Copyright © 2011-2022 走看看