1.函数定义
//三种函数定义方法
//1--函数声明语句
function sum(num1,num2)
{
return sum1+sum2;
}
//2--函数表达式
var sum=function(num1,num2){
return num1+num2;
};
//3--使用function构造函数
var sum = new Function('num1','num2','return num1+num2')
2. 函数参数
- 定义函数时形参不需要指定类型,调用函数时也不会检查实参的类型和个数。
- 形参可以指定默认值,如:
function sum(num1,num2=1)
。 - 如果函数的最后一个参数命名是以…为前缀,如:
...num
,则...num
为包含剩余参数的一个数组。
function sum(num1,...num2)
{
if(num2)
{
for(let i=0; i<num2.length;i++)
num1+=num2[i];
}
return num1;
}
3. 函数内部属性
- arguments对象:表示实参列表对象,它是一个类数组对象,可以通过下标访问对应的实参值。
//返回两个实参的和
function sum()
{
return arguments[0]+arguments[1];
}
- this对象:this是指函数执行的环境对象(也叫context)。一般来说,this指向调用函数的对象,如果没有,就是全局对象,在浏览器中就是window对象。
//-----1
var sum=function()
{
//严格模式下是undefined
//非严格模式下时window
console.log(this);
};
//-----2
var obj={
sum:function(){
//this为obj对象
console.log(this);
}
};
4.函数是特殊对象
函数是特殊的对象,意味着它也是一种值。所以函数可以当作参数传递,赋值给变量,作为数组的元素等。
//利用callSumFunc去调用sum函数
function sum(num)
{
var total=0;
for(let i=0; i<num.length; i++)
{
total+=num[i];
}
return total;
}
function callSumFunc(sumFunc,...num)
{
return sumFunc(num);
}
console.log(callSumFunc(sum,1,2,3,4));
5.函数的属性和方法
函数是一种特殊的对象,意味着它也可以有属性和方法。
- 属性:length、name
- 方法:call、apply、bind
//1.length:函数期望参数的长度,不包含默认参数和剩余参数
function func(num1,num2,num3=3,...num4)
{
return 0;
}
console.log(func.length); //2
//2.name
console.log(func.name); //name
//原始代码
var obj={
name:'John',
say:function(content){
var say = function(where){
console.log(this.name+' say '+content+where);
};
say('school');//直接调用,无法获取当前的this.name
}
};
obj.say('welcome to ');
//1.call方法:可以指定this和传入的参数列表
var obj={
name:'John',
say:function(content){
var say = function(where){
console.log(this.name+' say '+content+where);
};
say.call(this,'school');//!!除this外的参数以A,B,C...的形式传入
}
};
obj.say('welcome to ');
//2.apply方法:可以指定this和传入的参数列表,本质与call方法类似
var obj={
name:'John',
say:function(content){
var say = function(...where){
console.log(where);
console.log(typeof(where));
console.log(this.name+' say '+content+where);
};
say.apply(this,['school','home']);//!!除this外的参数以[A,B,C...]的形式传入
}
};
obj.say('welcome to ');
//3.bind方法
var obj={
name:'John',
say:function(content){
var say = function(where){
console.log(this.name+' said '+content+where);
};
var say1=say.bind(this);//生成一个新函数(say1)
say1('school'); //!!参数以A,B,C...的形式传入
alert(say1===say); //say和say1不是同一个函数
}
};
obj.say('welcome to ');
6.变量作用域
[例1]
var num=1;
var func=function(){
var num=2;
{
let num=3;
console.log(num+' is a num in block');//3
}
console.log(num+' is a num in func');//2
}
func();
console.log(num+' is a num out of func');//1
[例2]
var func=function()
{
{
var num1=1;
let num2=2;
console.log(num1);
console.log(num2);
}
console.log(num1);
console.log(num2); //Uncaught ReferenceError: num2 is not defined; num2找不到
}
func();