JS笔记之理解函数

(一)函数概述

函数声明

1,函数的声明语句

finction f(a,b){
	return a+b;
}

2,函数表达式:把匿名函数赋值给一个新的变量

var sum = function hello(a,b){
	console.log(sum===hello); //true
	return a+b;
}
sum(1,3);  //正常运行
hello(1,3); //报错

3,Function构造函数

var fn = new Function(‘x’,’y’,’return x+y’)
console.log(fun(1,2)) //打印3

函数返回值

函数没有返回值,则调用的结果是返回undefined

//捕获异常,了解就行,不是所有的代码之后的return之后的语句都不执行
function test(){
    try{
        console.log(x); //报错
        return 1;
    }catch(e){
        alert(e); //显示错误
        return 2;
    }finally{
        return 0;
    }
}

console.log(test()); //不论是否有错误,返回值始终为0

函数调用模式

函数有四种调用方式:函数调用模式,方法调用模式,构造调用模式,间接调用模式

//this的指向问题:当作普通函数调用,this指向window
//当作构造函数调用,this指向当前函数
//当作对象的方法,这个this一般指向当前对象

1。函数调用模式
函数中的this在非严格模式下指向window,在严格模式下指向undefined
2。方法调用模式

var obj = {
	//fn是obj对象的方法
	fn:function(){
		console.log(this);	//指向当前的obj对象
		console.log(’hi, there’);
	}
} 
obj.fun();

3。构造调用模式

function fn(){
	this.a = 1;
}
var obj = new fun();

4。间接调用模式call({},1,2). apply({},[1,2])

var obj = {};
function fun(a,b){
	return a+b;
}
console.log(fun(1,2));
//相当于执行console.log(fun.call(obj,1,2));
//对比:console.log(fun.apply(obj,[1,2]));

call()方法会改变指向

函数参数

严格模式下不允许同名形参,会报错
非严格模式下允许同名形参,但是只会识别最后一个

实参比形参个数少,剩下的形参都会设置为undefined
实参比形参个数多,考虑arguments,注意arguments不是一个真正的数组,它是类数组,可以用[]的形式来访问每一个元素。

函数不存在重载

重载:定义相同的函数名,传入的不同参数
在js中函数不存在重载现象。

(二)函数参数传递

基本数据类型

在向参数传递基本数据类型的值时,被传递的值会被复制到一个局部变量

引用数据

在向参数传递引用数据类型的值时,会把这个值在内存中的地址直接复制给局部变量

跟内存地址有关,我比较晕。

(三)apply和call方法

每个函数中都包含两个非继承而来的方法,两个方法都会改变this的指向,区别是obj参数之后的不一样
在非严格模式下,如果使用call()或者apply(),传入一个null或者是undefined,会被转换成一个全局对象window
在严格模式下,函数的指向始终是指定的值。传null就是null,传undefined就是undefind。

  • 找出数组的最大元素
let arr = [1,2,3,4,54];
Math.max.apply(null,arr);
  • 将类数组(比如arguments)转换成为真正的数组
function add(){
    var arr = Array.prototype.slice.apply(arguments);
    console.log(arr);
}
add(1,2,34,3)
  • 数组追加
var arr = [];
Array.prototype.push.apply(arr,[1,2,3,4]); 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值