[JS] 第六课:函数

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. 函数参数

  1. 定义函数时形参不需要指定类型,调用函数时也不会检查实参的类型和个数。
  2. 形参可以指定默认值,如:function sum(num1,num2=1)
  3. 如果函数的最后一个参数命名是以…为前缀,如:...num,则...num为包含剩余参数的一个数组。
function sum(num1,...num2)
{
	if(num2)
	{
		for(let i=0; i<num2.length;i++)
			num1+=num2[i];
	}
	return num1;
}

3. 函数内部属性

  1. arguments对象:表示实参列表对象,它是一个类数组对象,可以通过下标访问对应的实参值。
//返回两个实参的和
function sum()
{
	return arguments[0]+arguments[1];
}
  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.函数的属性和方法

函数是一种特殊的对象,意味着它也可以有属性和方法。

  1. 属性:length、name
  2. 方法: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();
发布了51 篇原创文章 · 获赞 5 · 访问量 4181

猜你喜欢

转载自blog.csdn.net/qq_43519498/article/details/103855473
今日推荐