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

  

JavaScript快速入门-ECMAScript函数的更多相关文章

  1. JavaScript快速入门-ECMAScript基础语法

    一.JavaScript引入方式 1.行内式 <script> alert(123); </script> 2.外链式 <script src='custom.js'&g ...

  2. JavaScript快速入门-ECMAScript对象介绍

    一.概念介绍 在 ECMAScript 中,所有对象并非同等创建的.一般来说,可以创建并使用的对象有三种:本地对象.内置对象和宿主对象. 要理解这三种对象,先要理解宿主环境. 1.宿主环境 一般宿主环 ...

  3. JavaScript快速入门-ECMAScript运算符

    1.逻辑运算符 逻辑与:&&(and) 逻辑或:||(or) 逻辑非:!(not) 逻辑 AND 运算符(&&) 逻辑 AND 运算的运算数可以是任何类型的,不止是 B ...

  4. JavaScript快速入门-ECMAScript本地对象(Array)

    Array对象 Array对象和python里面的list对象一样,是用来存储多个对象值的对象,且方法和属性基本上类似. 一.属性 lenght 二.方法  1.concat()  用于连接两个或多个 ...

  5. JavaScript快速入门-ECMAScript本地对象(RexExp)

    一.概述 RegExp 对象表示正则表达式,它是对字符串执行模式匹配的强大工具. 正则表达式是由一个字符序列形成的搜索模式. 当你在文本中搜索数据时,你可以用搜索模式来描述你要查询的内容. 正则表达式 ...

  6. JavaScript快速入门-ECMAScript语句

    JavaScript语句(if.for.for in.do...while.while.break.continue.switch) 一.if语句 if (condition) statement1 ...

  7. JavaScript快速入门-ECMAScript本地对象(String)

    一.String对象 String对象和python中的字符串一样,也有很多方法,这些方法大概分为以下种类: 1.索引和查找 1.charAt()   返回指定位置的字符. 2.charCodeAt( ...

  8. JavaScript快速入门-ECMAScript本地对象(Date)

    JavaScript中的Date 对象用于处理日期和时间. var myDate=new Date()  #Date 对象会自动把当前日期和时间保存为其初始值. 一.Date对象的方法 方法 示例 n ...

  9. JavaScript快速入门-ECMAScript本地对象(Number)

    Number 对象是原始数值的包装对象. 创建一个Number对象:var myNum=new Number(value); 注意: 1.参数 value 是要创建的 Number 对象的数值,或是要 ...

随机推荐

  1. SQLSERVER中的鬼影索引

    SQLSERVER中的鬼影索引 看这篇文章之前可以先看一下鬼影记录 了解了解一下SQLSERVER里的鬼影记录关于鬼影记录的翻译一关于鬼影记录的翻译二 当删除表中的某一条记录的时候,索引页面的对应记录 ...

  2. datetime24小时格式和12小时格式

    12:DateTime.Now.ToString("hh:mm:ss") 24:DateTime.Now.ToString("HH:mm:ss")

  3. 报错:java.net.bindexception: address already in use: jvm_bind:8080

    原因:8080端口被占用 这说明80端口(该端口是Tomcat的监听端口)已经被其他程序占用,先用命令提示符 " netstat -ano " 命令显示端口状态,再在结果中找到端口 ...

  4. Sql Server与.Net(C#)中星期值对比

    最近发现Sql Server与.Net(C#)中星期值居然不匹配,倒不知道依哪一个了. 1.Sql Server declare @date datetime; set @date = '2017-0 ...

  5. javascript中注册和移除事件的4种方式

    对于html中的一些元素注册事件的方式有多种 第一种: 复制代码代码如下: <script> function test() { alert("OK"); } < ...

  6. Java-控制台传递参数

    今天组长叫我把所有的参数(写死的),用控制器输入,使其变成可变的. ------我的程序是需要读取文件的,控制台输入即,是文件放在哪我都可以读取. 比如我需要读取的demo.txt文件在D盘根目录下, ...

  7. Linux 辅助命令

    0. 说明 记录在 Linux 使用过程中的一些有帮助的命令 1. 命令集合 [1.1 错误输出重定向] # 将错误信息重定向到 /dev/null source /xxx >/dev/null ...

  8. 安全之路 —— 利用SVCHost.exe系统服务实现后门自启动

    简介 在Windows系统中有一个系统服务控制器,叫做SVCHost.exe,它可以用来管理系统的多组服务.它与普通的服务控制不同的是它采用dll导出的ServiceMain主函数实现服务运行,详细原 ...

  9. 利用MSF的MS08_067模块攻击windows server 2003 SP2中文版系统

    一.测试环境 攻击机:kali(NMAP+MSF) 靶机:windows server 2003 SP2 中文版 利用漏洞:MS08_067 二.漏洞描述 MS08-067漏洞的全称为“Windows ...

  10. Docker技术入门与实战 第二版-学习笔记-6-仓库

    仓库(Repository)是集中存放镜像的地方 一个容易混淆的概念是注册服务器(Registry). 实际上注册服务器是管理仓库的具体服务器,每个服务器上可以有多个仓库,而每个仓库下面有多个镜像. ...