创建函数有两种方式第一种就直接定义函数
function abs(x) {
if(x>=0) {
return x;
} else {
return -x;
}
}
这里是定义了一个abs求绝对值的函数
var abs = function(x) {
if(x>=0) {
return x;
} else {
return -x;
}
}
这里的函数是匿名函数,相当于将匿名函数的结果赋值给了变量abs,这里是第二种函数定义方式。
在JavaScript中参数可以传递任意个,也可以不传出,那么我们如何修改传入后存在问题的参数,或者是去规避一些不存在的参数
还是拿abs函数来举例子
var abs = function(x) {
//手动抛出异常来判断
if(typeof x!== 'number') {
throw 'Not a Number';
}
if(x>=0) {
return x;
} else {
return -x;
}
}
绝对值函数针对的是 数字,但是如果传入字符串就没法使用函数,那么在这里我们手动添加一个if语句来规避这个问题
接下来就是js里面一个重要的功能arguments,获取所有的参数,并且以数组的形式存储下来,前面说过,js的数组包容性很强,他可以同时存储不同类型的变量
var abs = function(x) {
console.log("x=>"+x);
for(var i=0;i<arguments.length;i++) {
console.log(arguments[i]);
}
if(x>=0) {
return x;
} else {
return -x;
}
}
但是这样写,在调用所需参数后,想要用余下的参数时,一定要先排除已有的参数,这个时候我们就需要rest来帮助我们实现获取除了已经定义的参数之外的所有的参数
function f(a,b,...rest) {
console.log("a=>"+a);
console.log("b=>"+b);
console.log(rest);
}
这个就是获取ab之后所有的参数
注意:rest必须放到末尾,前面加上…
函数内部变量不能在外部使用
function f() {
var x = 1;
}
x = x + 2;
这样运行结果就是x未定义
function f() {
var x = 1;
}
function f2() {
var x = 'A';
}
因为两个x都是在不同函数内部所以不会冲突
内部函数可以访问外部变量,但是外部函数不能访问内部变量
function f() {
var x = 1;
function f3() {
var y = x+1;//2
}
var z = y+1;
}
这样写就是y未定义
内外部变量重名时不会互相影响
function f1() {
var x = 1;
function f2() {
var x = 'A';
console.log('inner'+x);//innerA
}
console.log('outer'+x);//outer1
}
JS中函数变量查找是从自身开始的,由“内”向“外”查找,假设外部存在同名的函数变量,则内部函数会自动屏蔽外部函数
上面是局部变量,下面来说说全局变量
要说全局变量首先全局对象,window,默认所有的全局变量都会绑定在window对象中,
var x = "xxx";
window.alert(window.x);
JS只有一个全局作用域,任何变量(函数其实也可以视为变量),假设没有在函数范围内找到,就会向外查找,如果在全局作用域都没有找到,就会报错RefrenceError
所有的全局变量都会绑定在window上,不同的js文件,使用了相同的全局变量,就会产生冲突,这样我们就需要一种规范
let局部作用域(ES6关键字),解决局部作用域的冲突问题:
function aa() {
for (var i = 0;i<100;i++) {
console.log(i);
}
console.log(i+1);//101
}
var:i出了这个作用域还可以使用
function aa() {
for (let i = 0;i<100;i++) {
console.log(i);
}
console.log(i+1);//Uncaught ReferenceError: i is not defined
}
ES6之前定义常量,只有用全部大写字母定义的就叫常量
ES6出现了const关键字,
const pi = "3.14";
pi = "123";
这样的pi就是一个常量,是不可修改的,所以在给pi赋值的时候就会报错。