JavaScript快速入门-ECMAScript函数

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

 

1、函数定义

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

函数是一组能够随时随地运行的语句。java

函数是 ECMAScript 的核心。python

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

  

2、参数

普通参数:形参闭包

特殊参数:arguments。相似python里面的sys.argv。一样有arguments.lenght,表示参数个数。编程语言

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

        }else{
            alert('gaga');
        }
    }
    func1('test');

 

3、返回值

除非明确指定返回值(return ***),不然返回值为undefined,同时返回空(return;)也是undefined。 函数

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

  

4、函数对象

在了解匿名函数前,须要了解一下函数对象。学习

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

  

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

上面的函数咱们也能够这样定义:spa

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

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

 

函数对象的属性:

  • length

函数对象的方法:

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

5、匿名函数

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

在JavaScript中基本上相似。

定义:

//一、 匿名函数-普通定义,无参数
      var func = function(){
        return ‘aaa’
    }
    alert(func());


//二、 匿名函数直接调用-无参数
    (function(){
        alert("tony");
    } )()

//三、匿名函数直接调用-有参数
    (function(arg){
        console.log(arg);
    })('123')

  

6、做用域

做用域(基础知识)

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

做用域五句话原则:

一、JavaScript中无块级做用域

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

  

二、JavaScript采用函数做用域

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

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

  

三、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(内建)查找。进行链式查找!

四、JavaScript的做用域链执行前已建立

JavaScript的做用域在被执行以前已经建立,往后再去执行时只须要按照做用域链去寻找便可。

因为JavaScript是先加载完,再调用。当全部命名空间加载完成后,最后去查找,因此做用域链在执行前就已经建立好了。

五、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。

7、闭包

做用域搞清楚后,理解闭包就很是简单了。

var city = 'beijing';

function func(){
    var city = "shanghai";
    function inner(){
        // var city = "langfang";
        console.log(city);
    }
    return inner;
}
var ret = func();
ret(); #shanghai
相关文章
相关标签/搜索