一、作用域
作用域:程序源代码定义的某个变量的区域
1.全局作用域:就是最外层的一个执行环境,在web浏览器中,就认为这个全局作用域是window对象
在全局声明的变量或者函数会作为window的属性和方法
全局中的变量、函数,具有全局作用域(在任何地方都可以调用)
全局变量或函数是直到退出应用或关闭网页才会被销毁
var a=1;
console.log(window);
2.局部作用域(函数作用域)
在函数的内部使用
在函数调用完毕的时候,其中的变量被销毁
函数内部可以使用全局变量,全局的变量(函数)不能使用(其他函数)内部变量
function fn() {
var c=999;
console.log(c);//999
}
console.log(c);//undefined
//c在函数中声明的,是局部变量,只能在函数中作用,在其他地方不作用
二、函数的创建和调用
使用function创建函数
创建函数语法:function 函数名(参数){代码块}
调用函数语法:函数名();
// 函数的创建
function fn(){//fn是函数名
console.log("1111");
}
// 调用函数
fn();//函数名()
//对象中的函数
var zww={
fn:function(){
console.log("222");
}
}
console.log(zww.fn);//打印函数
zww.fn();//调用对象中的函数
三、包装对象
对象是JavaScript中的主要类型,有三种原始类型的值:number string Boolean,他们在一定的条件下可以自动转化为对象,也就是原始类型的包装对象。
只要引用了这三种原始类型值的属性或方法,js就会自动通过以上方法包装成对象,并且这个包装成的对象是临时的,一旦属性引用结束,则新创建的的对象就会被销毁。
注意:undefined和null不能被包装成对象(所以undefined和null不能使用toString
举例1:
var str="123";
var strobj=new String(str);//将字符串包装成对象
console.log(strobj);
console.log(strobj[2]);
var aa=123;
var numobj=new Number(aa);//将数字包装成对象
console.log(numobj);
var bool=true;
var boolobj=new Boolean(bool);//将布尔值包装成对象
console.log(boolobj);
举例2:
var str2="123";
str2.length;
str.len=4;//自动包装对象,结束销毁
console.log(str.len);//undefined
var obj={
name:"obj",
}
console.log(obj.obj1.name);
//obj.obj1返回的是undefined undefined不能包装成对象,所以obj.obj1.name会报错
四、原始类型数据和引用数据类型的存储
存储位置:
1.原始数据类型:值存在栈中
2.引用数据类型:栈中存放地址,数据(值)存在堆中
注意:
原始数据类型的相互赋值,不会影响到其他变量(在栈中存的是值,不是地址)
栈中存引用数据的地址,指向堆中的地址,引用数据的内容存在堆中
举例:
var a=1;
var b=a;
console.log(a,b)
// 原始数据类型:值存在栈中 引用数据类型:栈中存放地址,数据(值)存在堆中
// 原始数据类型的相互赋值,不会影响到其他变量(在栈中存的是值,不是地址)
a=2;
console.log(a,b)
var obj={
name:"obj"
}
var obj2=obj;//把obj2指向obj的地址
obj.name="obj2";
console.log(obj2);//name:obj2
// 栈中存引用数据的地址,指向堆中的地址,引用数据的内容存在堆中
// obj obj2在栈中都指向obj 的地址,所以name会跟着一起改变
obj=null;
console.log(obj2);//将obj的地址变成null(断开了Obj 指向对堆中的地址,与obj2无关)