学习源:函数定义和调用 - 廖雪峰的官方网站 (liaoxuefeng.com)
一、函数
function 函数名(参数) { 函数体 return 返回值; }
请注意:1、函数体内部的语句在执行时,一旦执行到return
时,函数就执行完毕,并将结果返回。因此,函数内部通过条件判断和循环可以实现非常复杂的逻辑。
2、如果没有return
语句,函数执行完毕后也会返回结果,只是结果为undefined
3、JavaScript的函数也是一个对象,因此有第二种定义方式
var 变量名 = function (参数) { 函数体 return 返回值; };
在这种方式下,function整体是一个匿名函数,它没有函数名。但是,这个匿名函数赋值给了变量,因此通过变量就可以调用函数。
上述两种定义完全等价,注意第二种方式按照完整语法需要在函数体末尾加一个;,表示赋值语句结束。
4、由于JavaScript允许传入任意个参数而不影响调用,因此传入的参数比定义的参数多也没有问题,虽然函数内部并不需要这些参数;
5、JavaScript还有一个免费赠送的关键字arguments
,它只在函数内部起作用,并且永远指向当前函数的调用者传入的所有参数。arguments
类似Array
但它不是一个Array
:
6、rest参数: 只能写在最后,前面用...
标识,从运行结果可知,传入的参数先绑定a
、b
,多余的参数以数组形式交给变量rest
function foo(a, b, ...rest) { console.log('a = ' + a); console.log('b = ' + b); console.log(rest); }
7、JavaScript引擎有一个在行末自动添加分号的机制
function foo() { return { // 这里不会自动加分号,因为{表示语句尚未结束 name: 'foo' }; }
8、在JavaScript中,用var
申明的变量实际上是有作用域的。 -》 不同函数内部的同名变量互相独立,互不影响
9、由于JavaScript的函数可以嵌套,此时,内部函数可以访问外部函数定义的变量,反过来则不行
10、这说明JavaScript的函数在查找变量时从自身函数定义开始,从“内”向“外”查找
11、JavaScript的函数定义有个特点,它会先扫描整个函数体的语句,把所有申明的变量“提升”到函数顶部【变量提升】,请严格遵守“在函数内部首先申明所有变量”这一规则
12、不在任何函数内定义的变量就具有全局作用域
13、全局变量会绑定到window
上,不同的JavaScript文件如果使用了相同的全局变量,或者定义了相同名字的顶层函数,都会造成命名冲突,并且很难被发现
减少冲突的一个方法是把自己的所有变量和函数全部绑定到一个全局变量中。[命名空间]
// 唯一的全局变量MYAPP: var MYAPP = {}; // 其他变量: MYAPP.name = 'myapp'; MYAPP.version = 1.0; // 其他函数: MYAPP.foo = function () { return 'foo'; };
许多著名的JavaScript库都是这么干的:jQuery,YUI,underscore等等
14、由于JavaScript的变量作用域实际上是函数内部,我们在for
循环等语句块中是无法定义具有局部作用域的变量的:
为了解决块级作用域,ES6引入了新的关键字let
,用let
替代var
可以申明一个块级作用域的变量【局部作用域】
'use strict'; function foo() { var sum = 0; for (let i=0; i<100; i++) { sum += i; } // SyntaxError: i += 1; }
15、ES6标准引入了新的关键字const
来定义常量,const
与let
都具有块级作用域
16、解构赋值:简化代码
17、在一个对象中绑定函数,称为这个对象的方法。(要保证this
指向正确,必须用obj.xxx()
的形式调用!)
var xiaoming = { name: '小明', birth: 1990, age: function () { var y = new Date().getFullYear(); return y - this.birth; } };
本节仅将个人认为重要的注意点进行摘录阅读,后续随着岁月推移。会再深入不断详细介绍