立即执行函数
函数也可以称为对象的属性
如果一个函数作为一个对象的属性保存
那么我们称这个函数为这个对象的方法
调用函数就是调用这个对象的方法
但是注意只是名称的区别没有其他的区别
作用域
作用域指一个变量的作用的范围
一共两种作用域
1.全局作用域
直接编写在script标签中的Js代码,都在全局作用域
全局领域在页面打开时创建,在页面关闭时销毁
函数的作用域
调用函数是创建函数的作用域,函数执行完毕后函数作用域销毁
每调用一次函数就会创建一个新的函数作用域,他们之间相互独立的
函数的作用域中他们可以访问全局作用域的变量
在全局作用域中无法访问函数作用域的变量
当函数作用域中操作一个变量中,他会先在自身作用域中寻找,如果有就直接使用
如果没有就向上一级的作用域中寻找,直到找到全局作用域
在函数作用域中也有声明提前的特性
使用var关键字的变量,会在函数中所有的代码执行之前被声明
函数声明会在函数中所有的代码执行之前被声明
在函数中,不是用var声明的变量都会成为是全局变量
JS基础this
解析器在调用函数每次都会向函数内部传递进一个隐含的参数
这个隐含的参数就是this,this指向的是一个对象
这个对象我们成为是函数执行的上下文对象的
根据函数调用的方式不同,this会指向不同的对象
1.以函数的形式调用时,this永远都是Window
2.以方法的形式调用时,this就是调用方法的那个对象
使用工厂方法创建对象
创建对象的方法
工厂方法
<head>
<meta charset="utf-8">
<title></title>
<script type="text/javascript">
function creatDog(name,age){
var obj=new Object();
obj.name=name;
obj.age=age;
obj.sayHello=function(){
alert("旺旺~~~");
};
return obj;
}
var dog=creatDog("旺财",18);
console.log(dog);
dog.sayHello();
</script>
</head>
创建一个构造函数,专门用来创建Person对象的 构造函数就是普通的函数,创建方式和普通的函数无区别 不同的是构造函数习惯首字母大写 普通函数是直接调用,而构造函数就需要使用ne关键字来调用 构造函数的执行流程 1.立即创建一个新的对象 2.将新建的对象设置为函数中的this,在构造函数中可以使用This来引用新建的对象 3.逐行执行函数中的代码 4.将新建的对象作为返回值返回
使用instanceof可检查一个对象是否是一个类的实例 语法 对象instanceof构造函数 如果是,则返回true,否则返回false
所有的对象都是Object的后代
原型prototype(唯一的独特的)
我们所创建的每一个函数,解析器都会向函数中添加一个属性prototype
我们创建函数时可以将这些对象共有的属性和方法,统一添加到构造函数的原型对象中,这样不用分别为每个对象添加,也不会影响到全局作用域,就可以使每个对象都具有这些属性和方法
原型对象
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script type="text/javascript">
function MyClass(){
}
MyClass.prototype.namn="我是原型中的名字";
/* 创建一个对象 */
var mc =new MyClass();
console.log(mc.namn);
mc.name="123";
/* 用in检查对象中是否含有某个属性值如果对象中没有但是原型中有,也会返回true */
// console.log("namn" in mc);
/* 可以使用对象的hasOwnProperty()来检查对象自身中是否含有该属性 */
// 使用该方法只有当对象自身中含有属性时
// hasOwnProperty();是原型中的方法
/* 原型对象也是对象他也有原型当我们使用一个对象的属性或方法时会先在自身中寻找
自身中如果有,则直接使用
如果没有则去原型对象中寻找,,如果有则使用
如果没有则去原型的原型去寻找
Object对象的原型没有原型如果在Object中依然没有找到,则会返回undefined*/
console.log(mc.hasOwnProperty("name"));
</script>
</head>
<body>
</body>
</html>
数组中的方法
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script type="text/javascript">
// 创建一个数组
var arr=["孙悟空","猪八戒","沙和尚"];
// push()
// 该方法可以向数组的末尾添加一个或多个元素,并返回数组新的长度
// 可以将要添加的元素作为方法的参数传递,这样的元素将会自动添加到数组的末尾
// 该方法将数组新的长度作为返回值返回
// pop();
该方法可以删除数组的最后一个元素
/* unshift()
向数组开头添加一个或多个元素,并返回性的数组长度*/
shift();可以删除数组的第一个元素并将被删除的元素作为返回值
var result=arr.push("原子弹","电热毯","企鹅熊");
console.log("arr="+arr);
// 所谓遍历数组就是将数组中的元素都取出来
for(var i=0;i<arr.length;i++){
}
</script>
</head>
<body>
</body>
</html>
sort()
可以用来对数组中的元素进行排序
也会影响原数组,默认是按照Unicode编码进行排序的
即使对于纯数字的数组,使用sort()排序时,也会按照Unicode编码来排序
我们可以在sort()添加一个回调函数,来指定排序的规则,回调函数中需要两个实参
浏览器将会分别使用数组中的元素作为实参去调用回调函数
使用那个函数调用不确定,但是肯定的是在数组中a一定在b的前边
浏览器会根据回调函数的返回值来决定元素的顺序
如果返回一个大于0的值;元素会换位置
如果返回小于0的值,元素位置不变
如果返回一个0,认为两个元素相等,也不交换位置
如果需要正序排列
返回b-a
倒序排列
返回a-b
*/
arr.sort(function() {
return zhi;
});
arr.slice(0, 2);
</script>
</head>
<body>
</body>
</html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script type="text/javascript">
var arr = ["孙悟空", "猪八戒", "沙和尚", "唐僧", "白骨精"];
/*
slice()
可以用来从数组中提取指定的元素
参数
1.截取开始的索引,包含开始的索引
2.截取结束的索引不包含结束的索引
第二个参数可以省略不写,是到最后结束
索引可以传递负值
-1代表是倒数第一 */
/* splice()
可以删除数组中指定元素
会影响到原数组,可以删除数组中指定元素并返回被删除的元素
参数
1.表示的是开始位置的索引
2.表示的是删除的数量、
3到以后
可以传递一些元素,这些元素将会自动插入到开始索引的前边
*/
// 该方法不会改变元素的数组,而是将截取到的元素封装到一个新的数组中返回
/* concat()可以连接两个或多个数组,并将新的数组返回
该方法不会对原数组产生影响
不仅可以传元素,还可以传数组
join()
该方法可以将数组转换为一个字符串
该方法不会对原数组产生影响,而是将转换后的字符串作为结果返回
reverse()
该方法用来反转数组(前边的去后面,后面的去前边)
该方法会改变数组的顺序
sort()
可以用来对数组中的元素进行排序
也会影响原数组,默认是按照Unicode编码进行排序的
即使对于纯数字的数组,使用sort()排序时,也会按照Unicode编码来排序
我们可以在sort()添加一个回调函数,来指定排序的规则,回调函数中需要两个实参
浏览器将会分别使用数组中的元素作为实参去调用回调函数
使用那个函数调用不确定,但是肯定的是在数组中a一定在b的前边
浏览器会根据回调函数的返回值来决定元素的顺序
如果返回一个大于0的值;元素会换位置
如果返回小于0的值,元素位置不变
如果返回一个0,认为两个元素相等,也不交换位置
如果需要正序排列
返回b-a
倒序排列
返回a-b
*/
arr.sort(function() {
return zhi;
});
arr.slice(0, 2);
</script>
</head>
<body>
</body>
</html>