JS(三):深入函数之对象,调用,参数,返回值

一、面向对象简介

(一)对象

对象就是值的集合,任意值的集合。值包括所有5种基本类型以及3种引用类型的值。
为了方便访问值,就需要给值取个名字,这个就是属性。值和键在一起就形成了键值对。对象就是由一个又一个的属性所构成的。
对象无法直接使用,需要将它赋值给一个变量。
对象中的函数可称为方法。方法也是属性。
尽量少使用全局变量。
若是没有对象,就只能挨个声明全局变量,变量一多,容易造成命名冲突,而且分散。

(二)对象的使用

创建对象的方式:
1.var cat = new Object();//实例化构造函数创建对象
2.var cat = {};//字面量创造对象,使用得最多
3.ES5下有个方法:Object.create();//老版本浏览器会存在兼容问题

使用对象:对对象进行读写
提取属性并赋值:
1.cat.name = ‘Tim’;
2.cat[‘name’] = ‘Tim’;//使用此方法方括号内部必须加引号。

创建新属性:
cat.type = ‘加菲猫’;

读取属性:
console.log(cat.name);
console.log(cat[‘name’]);
console.log(cat.type);

删除属性:
delete cat.type;
console.log(cat.type);//undefined
没有值的属性是undefined,不会报错。

检测对象是否有某属性:
属性名 in 对象名;//属性名需要加引号。
console.log(‘name’ in cat);//返回true。

遍历对象中的各个属性:
for( var p in cat ) {//这里的的p代表属性名property,可取任意名字。
console.log§;//这里打印的是属性名;
console.log(cat[p]);//这里打印的是属性所对应的值。方括号内可做运算,字符串拼接等。方括号比点语法的功能更强大,点语法后面只能跟表示字符串的,方括号是可以做运算的。
console.log(cat.p);//等同于cat[‘p’]; 相当于cat = {‘p’:‘123’} cat中有个属性名为p的属性,所以返回undefined。我们需要得到的是p这个变量所代表的值。
}

二、函数介绍

一次定义,n次调用.
1.function关键字:作用就是告诉js解析器(浏览器),这里是一个函数,必写。函数保存在内存中。
2.函数名:区分不同函数,通过函数名来直指函数在内存中的位置。没有名字的函数是匿名函数,有名字的叫命名函数。
3.参数:可以什么都不写,可以写一个或多个,用逗号分隔。js中传入的参数可以和函数定义上形参的数目不一致。
4.函数体:局部作用域。
return有两层含义:其一表示函数结束(不要把代码写在return之后,是不会被读取到的),其二将return后面的内容返回

函数定义和调用时发生了什么:
定义:封装了代码,window下面多了个属性,在局部作用域销毁后,该属性,节点仍可以调用。
调用:创建了局部作用域,接着赋值,执行,执行完毕后,销毁局部作用域,局部变量一块被销毁,第二次执行,会创建新的局部作用域,和之前不是同一个作用域。
在这里插入图片描述
为什么要使用函数:
1,复用代码。(自己和他人)
2,统一修改和维护。
3,增强代码可读性。

什么时候该使用函数:
1,当程序中有太多相似或相同的代码。
2,程序暴露过多细节,可读性变差的时候。

函数的本质:
1.可调用。
2.函数其实是对象。很多像js的语言才有。

对象定义的方式:
1.字面量的方式{}:
function add(num1,num2){};
2.构造函数的方式new Object():
new Function(‘num1’,‘num2’,’…’);

添加属性和方法:
对象添加属性和方法:

var person = {
   };
person.name = 'xm';
person.setName = function (name) {
   
	this.name = name;
}

函数添加属性和方法:

function add(num1, num2) {
   
	return num1 + num2;
}
add.sex = 'male';
add.setSex = function (sex) {
   
	this.sex = sex;
}
console.log(add.sex);//male
console.log(add.setSex('female'));//undefined,函数内部只是发生了设置,没有返回值,这里输出的是返回值。
console.log(add.sex);//female
console.log(add(1, 2));//3

我们可以通过给函数添加属性,来保存一些特定的值,来缓存一些内容。

作为数据值使用:

var add=function (){
   };---匿名函数,负值给一个变量add。

作为参数:

setTimeout(function(){
   },1000}
//或者
function fn(){
   };
setTimeout(fn,1000);

作为返回值:

function fn(){
   
return function(){
   console.log(1);};
var newFn=fn();
newFn();
或者直接写fn()();

三、函数定义

三种定义方式:
1.字面量
function声明

function add() {
   
// body...
} //这里是一个声明,不是一个语句,所以是不用加分号的。
add();//调用

2.var赋值表达式

var add = function (argument) {
   
	// body...
};
add();//调用
var add = function fn(argument) {
   
//这里函数有两个名字。但是这里的fn就变成了局部变量,只能在函数体内找到调用,在函数体外调用会报错。
	// body...
	fn(); //作为局部变量,在函数体内可以调用。
	add(); //add不仅可以在函数体内调用,也可以在函数体外调用。
};
add();
fn();//报错,是局部变量,只能在函数体调用

3.构造函数(效率差一些,因为需要解析字符串,之后还要实例化这个函数)

var add = new Function('num1', 'num2', 'return num1 + num2;');//括号内的参数和函数体一定要用字符串的形式,加上引号包裹。
add();

上面3种方法是的区别:
构造函数的方式效率会差一些,声明的过程实际分成了两步:先解析字符串,再实例化函数。所以一般不选择用构造函数的方式。
字面量的方式和用var赋值表达式的方式在预解析过程中存在很大区别,字面量的方式在预解析过程中是当做函数function对象,在预解析过程中就声明;而var赋值表达式是当做变量对待,预解析过程赋值undefined。
所以字面量的方式就将声明提前,在之前之后调用都可以。

根据团队风格选择方式。

函数定义的位置:
1.定义在全局作用域。
2.定义在函数作用域内,沿着作用域链向外查找。
3.if / for 中的代码块,js中相当于是全局的。不推荐在if / for 的代码块中声明函数,放在外面去。
4.定义在对象中。

var person={
   
	name:'xm',
	setSex:function(sex){
   
		this.sex=sex;
	}
};
person.setName=function(name){
   
	this.name=name;
}
person.setSex();//需要用对象.函数的方式调用

函数定义在对象中,可以通过键值对的方式直接定义,也可以通过对象.的方式增加属性,然后用函数赋值。
这种情况下,不能直接通过函数名来调用,需要用对象.函数的方式调用。

四、函数的调用

(一)普通函数的调用

匿名函数的调用方式:

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值