JavaScript于Java的内存分配有些却别,这里暂时先记录JavaScript的内存知识
JavaScript的内存分为栈内存与堆内存,基本数据类型保存在栈内存中,引用数据类型(对象)是保存在堆内存中
对象在内存中的存储图示
var a = new Object();
var b = {}; //对象字面量
本质上是一样的
但是字面量的定义方法可以在申明的同时添加属性
var obj = {name:'wby',age : 18,gender : 'male'};
函数对象的一些知识点
【代码】
function myFunction(){ console.log('________'); }
myFunction和**myFunction()**是有区别的,前者是指这个函数对象,后者是调用对象
匿名函数(立即执行函数)
(function(a,b){
console.log(a+b);
})(22,33)
作用域
全局作用域
- 直接编写在script标签中的js代码,都在全局作用域
- 全局作用域在页面打开的时候创建,在页面关闭的实惠欧销毁
- 在全局作用域中有一个全局对象window,我们可以直接使用
- 他代表的是浏览器的窗口,我们可以直接使用
- 创建的变量都作为window对象的属性保存
- 创建的函数都都会作为window对象的方法保存
- 使用【var】关键字声明的变量会在所有代码执行之前被声明,会在执行该条语句的时候被赋值,若果申明变量的时候没有使用【var】,则不会
- 函数的声明提前:使用函数声明形式创建的函数function函数(){},他会在所有代码的执行之前就被创建,所以我们可以在函数声明代码之前就调用
fun(); //可以正确执行
a(); //不可以被执行,因为var a语句只是在所有代码执行之前被声明了,而没有被赋值,真正的赋值操作在对应的代码行处,所以不能提前执行这个函数
function fun(){
console.log('wwwwww');
}
var a = function fun2(){
console.log('aaaaa');
}
函数作用域
- 调用函数时创建函数作用域,函数执行完毕后,函数作用域销毁
- 每调用一次函数就会创建一个县的函数作用域,他们之间是相互独立的
- 当在函数作用域操作一个变量的时候,他会先在自身作用域中寻找,如果有就直接使用,如果没有则选项上一级作用域寻找,知道找到全局作用域,如果全局作用域中也没有,就会报错,ReferenceError,在函数中想要访问全局变量,可以直接window.变量名
- 在函数中不使用【var】申明的变量都会成为全局变量,相当于window.变量名
- 函数中的形参和函数语句中的【var 变量】是一样的存在
【this】知识点
- 在函数中this指向的是window对象
- 在方法中this指向的是该方法的包含对象