一、对象方法
函数也可以成为对象的属性,如果一个函数作为一个对象的属性保存,那么我们称这个函数是这个对象(obj)的方法,调用函数就说调用对象(obj)的方法(method),但是他只是名称上的区别,没有其他的区别。
<script>
/* 创建对象
*/
var obj=new Object();
//向对象中添加属性
obj.name="孙悟空";
obj.age=18;
//对象的属性值可以是任何的数据类型,也可以是个函数
obj.sayName=function(){
console.log(obj.name);
};
console.log(obj.sayName);//打印函数属性
obj.sayName();//调用obj.sayName()函数。也叫调用obj的sayName方法
var obj2={
name:"猪八戒",
age:18,
sayName:function(){
console.log(obj2.name);
}
};
obj2.sayName();
</script>
二、枚举对象中的属性
for...in 语句
语法: for(var 变量 in 对象){}
for...in语句 对象中有几个属性,循环体就会执行几次
每次执行时,会将对象中的一个属性的名字赋值给变量
<script>
var obj={
name:"孙悟空",
age:18,
gender:"男",
address:"花果山"
};
console.log(obj.name)
//枚举对象中的属性
for(var n in obj){
console.log('属性名:'+n)//对象中每个属性的名字赋值给n
console.log('属性值:'+obj[n]);//获取obj中赋值给n的属性的属性值
// []可以传变量
}
</script>
三、作用域(作用范围)
1、定义:
作用域指一个变量的作用的范围
2、在JS中有两种作用域
1:全局作用域
—直接编写在script标签中的Js代码,都在全局作用域
—全局作用域在页面打开时创建,在页面关闭时销毁
—在全局作用域中有一个全局对象window,它代表的是一个浏览器的窗口,它由浏览器创建,我们可以直接使用它
—在全局作用域中:
创建的变量都会作为window对象的属性保存
创建的函数都会作为window对象的方法保存
—全局作用域中的变量都是全局变量,在页面的任意部分都可以访问的到
<script>
var a=10;
var b=10;
// var c="hello";
console.log(window.c);//加window.,如果没有找到变量c,会undefined,不加的话,会报错
function fun(){
console.log("我是fun函数");
}
window.fun();//创建的函数都会作为window对象的方法保存
</script>
2:函数(局部)作用域
—调用函数时创建函数作用域,函数执行完毕以后,函数作用域销毁
—每调用一次函数就会创建一个新的函数作用域,他们之间是互相独立的
—在函数作用域中可以访问到全局作用域的变量,在全局作用域中无法访问到函数作用域的变量
—当在函数作用域中操作一个变量时,它会先在自身作用域中寻找,如果有,就直接使用,如果没有,就去它上一级作用域去寻找,如果全局作用域中依然没找到,则会报错
—在函数中如果要访问全局变量,可以使用window对象
<script>
//创建一个全局变量
var a = 10;
function fun() {
var a = "我是fun函数中的变量a";
//console.log("a="+a);
function fun2() {
// console.log(a);
console.log("a=" + window.a);
}
fun2(); //10
}
fun();
/*
2:在函数作用域也有声明提前的特性
使用var关键字声明的变量,也会在函数中所有代码执行之前被声明
函数声明也会在函数中所有的代码执行之前执行
*/
function fun3() {
console.log(a); //在声明前输出,没有就向外寻找,相当于在声明前加了var a=;没有赋值
var a = 35;
}
fun3(); //undefined
/*
3:在函数中,不使用var声明的变量都会成为全局变量
*/
var c = 33;
function fun5() {
console.log("c=" + c);
c = 10; //会成为全局变量,改变上面c的值
d = 100; //d没有使用var关键字,则会设置为全局变量
}
fun5(); //33
//在全局输出c
console.log("d=" + d);
var e = 23;
//4:定义形参就相当于在函数作用域中声明了变量
function fun6(e) {
console.log(e);
}
fun6(); //undefined
</script>
四、声明提前
1、变量的声明提前
-使用var关键字声明变量,会在所有的代码执行之前被声明(但是不会被赋值),但是如果声明变量时不使用var关键字,则变量不会被声明提前
2、函数的声明提前
-使用函数声明创建的函数function 函数(){},它会在所有的代码执行之前就被创建,所以我们可以在函数声明前调用函数
-使用函数表达式创建的函数,变量会被提前声明,但不能在声明前调用,undefined调用后会报错
</script>
//var a;//使用var关键字声明变量,会在所有的代码执行之前被声明(但是不会被赋值)
//var a=123;
console.log("a="+a)
var a=123;//var写在后面,会显示undefined,相当于在代码执行之前var a;
//a=123;
//window.a=123;//不使用var 会被报错
fun()//可以调用,
fun2()//不可以调用
console.log(fun2);//undefind
function fun() {//函数声明,会被提前创建
console.log("我是fun函数");
}
var fun2=function(){//函数表达式
console.log("我是fun2函数");
}
</script>
五、this
解析器在调用函数每次都会向函数内部传递一个隐含的参数,这个隐含的参数就是this,this是参数,浏览器传输的,直接拿来用的
this指向的是一个对象,这个对象我们称为函数执行的上下文对象,根据函数的调用方式的不同,this会指向不同的对象
1.以函数的形式调用时,this永远是window
2:以方法的形式调用时,this就是调用方法的那个对象
this就是当前对象,我们找的this就是当前作用域取值范围
<script>
//创建一个fun()函数
function fun() {
// console.log(name)
console.log(this.name);
}
//创建两个对象
var obj = {
name: "孙悟空",
sayName: fun,
};
var obj2 = {
name: "沙和尚",
sayName: fun,
};
// var name="全局的name属性";//如果没有的话,就会调函数里的
fun(); //==window.fun() 以函数的形式调用,this就是window
//需求:可以输出各自obj的名字
obj.sayName(); //object 以方法的形式调用,this是调用方法的对象
obj2.sayName();
</script>