javaScript的函数
js可以使用function关键字定义一个函数,函数可以通过申明定义,也可以是一个表达式。
function add(agrs1,args2){
return agrs1 + args2;
}
add(1,2);
var fun = function(){ console.log("test") }; //此时函数使用变量存储,没有函数名,称为匿名函数
fun();
javaScript使用Function关键字定义构造函数
var fun = new Function("a","b","return a / b");
var m = fun(2,1);
在实际开发中应该尽量避免使用new关键字
函数提升
变量可以提升,函数也可以提升。即先使用后声明
add(1,2);
function add(agrs1,args2){
return agrs1 + args2;
}
//使用表达式声明函数【匿名函数】不可以提升
fun(); //不合法
var fun = function(){ console.log("test") };
自执行函数
使用表达式声明的函数可以自调用
(function(){
.....
})(); // 此时函数会自动执行
函数可以作为表达式或值使用
var fun = function(a,b){
return a * b + a / b;
}
var x = fun(1,2) + 3;
function getVal(){
return '123';
}
var x = getVal;
箭头函数
const add = (x,y) => { return x + y; }
注意:
- 箭头函数没有自己的this,所以不适合作为一个对象的方法。
- 使用const存储函数可以保证函数表达式始终为一个常量。
- 箭头函数的this指向外层的this。
- 箭头函数无法提升,需要在使用之前定义。
函数参数
- javaScript对函数的参数不会做任何检查。
- JavaScript 函数定义显式参数时没有指定数据类型。
- JavaScript 函数对隐式参数没有进行类型检测。
- JavaScript 函数对隐式参数的个数没有进行检测。
如果函数定义了显示参数但是没有传参数,默认为undefined
function agrs(a1,a2){
if(a1 === undefined){
a1 = 0; // a1 = a1 || 0; 最好给参数一个默认值
}
}
es6函数可以自带默认参数值
function args(a1 = 1,a2 = 2){
return a1 + a2;
}
使用 arguments获取函数参数列表
var x = function(){
var args = arguments; //1,2,3,4,5,6
}
x(1,2,3,4,5,6);
调用函数
注意构造函数的调用
// 构造函数:
function myFunction(arg1, arg2) {
this.firstName = arg1;
this.lastName = arg2;
}
var obj = new myFunction("a","b");
obj.firstName;
//构造函数中 this 关键字没有任何的值。this 的值在函数调用实例化对象(new object)时创建。
作为对象方法调用
function myFunction(a, b) {
return a * b;
}
myObject = myFunction.call(myObject, 10, 2); //call()与apply()第一个参数必须为对象
var argsArr = [10,2];
myObject = myFunction.apply(myObject, argsArr);
两个方法都使用了对象本身作为第一个参数。 两者的区别在于第二个参数: apply传入的是一个参数数组,也就是将多个参数组合成为一个数组传入,而call则作为call的参数传入(从第二个参数开始)。
在 JavaScript 严格模式(strict mode)下, 在调用函数时第一个参数会成为 this 的值, 即使该参数不是一个对象。
在 JavaScript 非严格模式(non-strict mode)下, 如果第一个参数的值是 null 或 undefined, 它将使用全局对象替代。也就是说apply或者call能够改变this的指向。
本文借鉴 菜鸟教程-javaScript函数篇