JS函数与对象

1. 函数其它

函数的命名
1.由字母、数字、下划线、 符 号 组 成 , 不 能 以 数 字 开 头 2. 不 能 是 关 键 字 和 保 留 字 , 例 如 : f o r , w h i l e , t h i s , n a m e 3. 区 分 大 小 写 规 范 : 1. 变 量 名 必 须 有 意 义 2. 遵 守 驼 峰 命 名 法 3. 建 议 不 要 用 符号组成,不能以数字开头 2.不能是关键字和保留字,例如:for,while,this, name 3.区分大小写 规范: 1.变量名必须有意义 2.遵守驼峰命名法 3.建议不要用 2.for,while,this,name3.1.2.3.作为变量名

函数的覆盖问题
函数重复定义会覆盖前一个
arguments的使用
JavaScript中,arguments对象是比较特别的一个对象,实际上是当前函数的一个内置属性。也就是说所有函数都内置了一个arguments对象,arguments对象中存储了传递的所有的实参。arguments是一个伪数组,因此也可以进行遍历。

匿名函数
匿名函数:没有名字的函数
匿名函数如何使用:
将匿名函数赋值给一个变量,这样就可以通过变量进行调用

自调用函数
匿名函数不能通过直接调用来执行,因此可以通过匿名函数的自调用的方式来执行
(function () {
alert(123);
})();

函数是一种数据类型
function 类型 可以通过typeof 检测

函数作为参数
因为函数也是一种类型,可以把函数作为两一个函数的参数,在两一个函数中调用
函数做为返回值
因为函数是一种类型,所以可以把函数可以作为返回值从函数内部返回,这种用法在后面很常见。
代码规范(详见html文档中的命名规范,以下为基本)
1.命名规范
2.变量规范
var name = ‘zs’;
3.注释规范
// 这里是注释
4.空格规范
5.换行规范
var arr = [1, 2, 3, 4];
if (a > b) {
}
for(var i = 0; i < 10; i++) {

}
function fn() {
  
}

2. 预解析

JavaScript引擎在对JavaScript代码进行解释执行之前,会对JavaScript代码进行预解析,在预解析阶段,会将以关键字var和function开头的语句块提前进行处理。
关键问题是怎么处理呢?
当变量和函数的声明处在作用域比较靠后的位置的时候,变量和函数的声明会被提升到作用域的开头。

函数提升
func();
function func(){
alert(“Funciton has been called”);
}

由于JavaScript的预解析机制,上面的代码就等效于:
function func(){
alert(“Funciton has been called”);
}
func()

变量提升

alert(a);
var a = 1;

由于JavaScript的预解析机制,上面这段代码,alert出来的值是undefined,如果没有预解析,代码应该会直接报错a is not defined,而不是输出值,不是说要提前的吗?那不是应该alert出来1,为什么是undefined?

所以我们说的提升,是声明的提升。
那么再回过头看,上面的代码就等效于:

var a; //这里是声明
alert(a);//变量声明之后并未有初始化和赋值操作,所以这里是 undefined
a = 1

函数提升的深入(覆盖问题)

函数同名
观察下面这段代码:

func1();
function func1(){
console.log(‘This is func1’);
}

func1();
function func1(){
console.log(‘This is last func1’);
}

输出结果为:
This is last func1
This is last func1
原因分析:由于预解析机制,func1的声明会被提升,提升之后的代码为:

function func1(){
console.log(‘This is last func1’);
}

func1();
func1();

同名的函数,后面的会覆盖前面的,所以两次输出结果都是This is last func1。

变量和函数同名
alert(foo);
function foo(){}
var foo = 2;
当出现变量声明和函数同名的时候,只会对函数声明进行提升,变量会被忽略。所以上面的代码的输出结果为
function foo(){}
我们还是来吧预解析之后的代码展现出来:

function foo(){};
alert(foo);
foo = 2;

再来看一种

var num = 1;
function num () {
alert( num );
}
num();
代码执行结果为:
Uncaught TypeError: num is not a function

直接上预解析后的代码:
function num(){
alert(num);
}

num = 1;
num();

函数表达式并不会被提升

func();
var func = function(){ //这里的function就是表达式 ,不会被提升,提升的只有func这个变量名
alert(“我被提升了”);
};
这里会直接报错,func is not a function,原因就是函数表达式,并不会被提升。只是简单地当做变量声明进行了处理,如下:
var func;
func();
func = function(){
alert(“我被提升了”);
}

4. 对象

为什么要有对象
function printPerson(name, age, sex…) {
}
// 函数的参数如果特别多的话,可以使用对象简化
function printPerson(person) {
console.log(person.name);
……
}
JavaScript中的对象
JavaScript中的对象其实就是生活中对象的一个抽象。
JavaScript的对象是无序属性的集合。
其属性可以包含基本值、对象或函数。对象就是一组没有顺序的值。我们可以把JavaScript中的对象想象成键值对,其中值可以是数据和函数。
对象的行为和特征
特征—属性
行为—方法
Tips:
事物的特征在对象中用属性来表示。
事物的行为在对象中用方法来表示。

对象创建方式

对象字面量
var o = {
name: ‘zs’,
age: 18,
sex: true,
sayHi: function () {
console.log(this.name);
}
};

new Object()创建对象

var person = new Object();
person.name = ‘lisi’;
person.age = 35;
person.job = ‘actor’;
person.sayHi = function(){
console.log(‘Hello,everyBody’);
}

工厂函数创建对象
function createPerson(name, age, job) {
var person = new Object();
person.name = name;
person.age = age;
person.job = job;
person.sayHi = function(){
console.log(‘Hello,everyBody’);
}
return person;
}
var p1 = createPerson(‘张三’, 22, ‘actor’);

自定义构造函数
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.sayHi = function(){
console.log(‘Hello,everyBody’);
}
}
var p1 = new Person(‘张三’, 22, ‘actor’);

属性和方法

  1. 如果一个变量属于一个对象所有,那么该变量就可以称之为该对象的一个属性,属性一般是名词,用来描述事物的特征
  2. 如果一个函数属于一个对象所有,那么该函数就可以称之为该对象的一个方法,方法是动词,描述事物的行为和功能

new关键字
构造函数,是一种特殊的函数。主要用来在创建对象时初始化对象,即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。

  1. 构造函数用于创建一类对象,首字母要大写。
  2. 构造函数要和new一起使用才有意义。

new在执行时会做四件事情:
new会在内存中创建一个新的空对象
new会让this指向这个新的对象
执行构造函数,目的:给这个新对象加属性和方法
new会返回这个新对象

this详解

JS中this的指向问题,有时会让人难以捉摸,随着学习的深入,我们可以逐渐了解。
函数内部的this几个特点:

  1. 函数在定义的时候this是不确定的,只有在调用的时候才可以确定
  2. 一般函数直接执行,内部this指向全局window
  3. 函数作为一个对象的方法,被该对象所调用,那么this指向的是该对象
  4. 构造函数中的this其实是一个隐式对象,类似一个初始化的模型,所有方法和属性都挂载到了这个隐式对象身上,后续通过new关键字来调用,从而实现实例化

删除对象的属性
function fun() {
this.name = ‘mm’;
}
var obj = new fun();
console.log(obj.name); // mm
delete obj.name;
console.log(obj.name); // undefined

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值