函数
JavaScript函数语法
JavaScript函数通过Function关键词进行定义,其后是函数名和括号()。
函数名可包含字母、数字、下划线、美元符号(规则与变量名相同)。
圆括号可包括有都好分隔得参数:
(参数1,参数2,…)
有函数执行得代码呗放置在花括号中:{}
function name (参数1,参数2,参数3){
要执行得代码
}
函数参数(Function parameters)是在函数定义中所列的名称。
函数参数(Function arguments)是当调用函数时由函数接收的真实的值。
在函数中,参数是局部变量。
函数调用
函数中得代码将在其他代码调用该函数时执行:
- 当事件发生时(当用户点击按钮时)
- 当JavaScript代码调用时
- 自动得(自调用)
函数返回
当JavaScript到达return语句,函数将停止执行。如果函数被某条语句调用,JavaScript 将在调用语句之后“返回”执行代码。
函数通常会计算出返回值。这个返回值会返回给调用者
实例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JS函数</title>
<script>
function f(x) {/*function 指出这是一个函数定义;f 代表函数的名称*/
if (x > 0) {/*(x)代表函数的参数,可以多个参数,用','隔开*/
return x;
}else {
return -x;
}
}
// arguments - js中的一个关键字,只在函数内部起作用,永远指向函数内部
// 传入的所有参数,和array很想,但是又不是array
function a(x) {
console.log('x = ' + x);
for (var i = 0; i < arguments.length;i++){
console.log('arguments' + i + '=' + arguments[i]);
}
}
console.log(a(10,20,30,'xi','dd'));
function a2(a, b, c) {
if (arguments.length == 2) {
// 实际拿到的参数a和b,c为undefined
c = b;
b = null;
return c;
}
}
console.log(a2(1,2))
// rest参数
function sum(a,b) {
var i, rest=[];
if (arguments.length > 2) {
for (i = 2; i < arguments.length; i++){
rest.push(arguments[i]);
}
}
console.log('a = ' + a);
console.log('b = ' + b);
console.log(rest);
}
console.log(sum(2,3,4,5,7,8));
</script>
</head>
<body>
</body>
</html>
javascript自动在行尾添加分号机制
1.分号(;),通常会用在一行语句的结尾,代码如下:
var webName = "hello word";
var url = "www.baidu.com";
document.write(webName,url);
输出结果:
2.当将代码末尾去掉分号后,代码如下:
var webName = "hello word"
var url = "www.baidu.com"
document.write(webName,url)
输出结果为:
3.由于编译器会在每一行后面都自动添加了分号,所以输出值undefined,不是"hello word"。
function add(webName){
return
webName
}
console.log(add("hello word"));
变量作用域与解构赋值
在JavaScript中,用var申明的变量实际上是有作用域的。
如果一个变量在函数体内部申明,则该变量的作用域为整个函数体,在函数体外不可引用该变量:
'use strict';
function foo() {
var x = 1;
x = x + 1;
}
x = x + 2; // ReferenceError! 无法在函数体外引用变量x
不同函数内部得同名变量互相独立,互不影响:
function foo() {
var x = 1;
x = x + 1;
return x;
}
console.log(foo());
function bar() {
var x = 'A';
x = x + 'B';
return x;
}
console.log(bar());
由于JavaScript的函数可以嵌套,此时,内部函数可以访问外部函数定义的变量,反过来则不行:
function foo() {
var x = 1;
function bar() {
var y = x + 1; // bar可以访问foo的变量x!
}
var z = y + 1; // ReferenceError! foo不可以访问bar的变量y!
}
全局作用域
不在任何函数内定义的变量就具有全局作用域。实际上,JavaScript默认有一个全局对象window,全局作用域的变量实际上被绑定到window的一个属性:
var course = 'Learn JavaScript';
alert(course); // 'Learn JavaScript'
alert(window.course); // 'Learn JavaScript'
因此,直接访问全局变量course和访问window.course是完全一样的。
解构赋值
从ES6开始,JavaScript引入了解构赋值,可以同时对一组变量进行赋值。
什么是解构赋值?我们先看看传统的做法,如何把一个数组的元素分别赋值给几个变量:
var array = ['hello', 'JavaScript', 'ES6'];
var x = array[0];
var y = array[1];
var z = array[2];
现在,在ES6中,可以使用解构赋值,直接对多个变量同时赋值:
// 如果浏览器支持解构赋值就不会报错:
var [x, y, z] = ['hello', 'JavaScript', 'ES6'];
解构赋值还可以忽略某些元素:
let [, , z] = ['hello', 'JavaScript', 'ES6']; // 忽略前两个元素,只对z赋值第三个元素
z; // 'ES6'