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. MiUI开发者版刷入xposed框架--简洁方法

    一,首先要确定手机是否解锁 可以去这里查看怎么解锁: http://www.miui.com/unlock/index.html 二,手机系统需要是开发者版,且在安全中心的授权管理打开了ROOT授权 ...

  2. python基础一数据类型之列表

    摘要: python基础一中写到列表,那么这篇主要讲列表. 1,定义列表 2,列表.元祖.字符串都属于序列,都可以用用索引和切片. 3,列表的方法 1,定义列表 list1 = ['a','b',1, ...

  3. SQL Server 如何设置数据库的默认初始大小和自动增长大小

    我们在SQL Server中新建数据库的时候,可以选择数据库文件及日志文件的初始大小.自动增长大小和最大大小,如下图所示: 可以通过设置更改数据库初始大小.自动增长大小和最大大小: 但是其实在SQL ...

  4. [原创]使MySQL注释语句在后台能够输出的方法

    开启general log或slow log的时候,前端发出的sql语句中的注释都别屏蔽掉了. 本意加注释我们想通过注释来快速知道sql是由哪个业务模块发出的.这点对dba和研发很有帮助. 一种变通的 ...

  5. [转]Java学习---7大经典的排序算法总结实现

    [原文]https://www.toutiao.com/i6591634652274885128/ 常见排序算法总结与实现 本文使用Java实现这几种排序. 以下是对排序算法总体的介绍. 冒泡排序 比 ...

  6. React阻止事件冒泡的正确打开方式

    需求:点击导航list按钮出现侧弹框,点击空白处弹框消失 问题:绑定空白处的点击事件到document上,但是非空白处的点击也会触发这个点击事件,在react中如何阻止事件冒泡? 解决方法:e.sto ...

  7. Swift 实践篇之链式 UI 代码

    https://blog.nswebfrog.com/2017/10/20/swift-practice-ui-chaining-code/

  8. 基于duxshop遍历无限级分销用户的纵向递归

    /**获取基准数据 * @param $ids 父id 多个逗号分隔 * @return array */ public function saleBase($ids) { $data=$this-& ...

  9. 【转】Android7.0适配心得

    本文出自:贾鹏辉的技术博客(http://www.devio.org) http://www.devio.org/2016/09/28/Android7.0%E9%80%82%E9%85%8D%E5% ...

  10. [转]VS 2012环境下使用MFC进行OpenGL编程

    我就不黏贴复制了,直接给出原文链接:VS 2012环境下使用MFC进行OpenGL编程 其它好文链接: 1.OpenGL系列教程之十二:OpenGL Windows图形界面应用程序