预解释
js数据类型
基本数据类型
number
string
boolean
null
undefined
引用数据类型
object:{},[]、/……$/,Date
function
基本数据类型和引用数据类型的区别
基本数据类型是按照值来操作的,引用数据类型是按照引用地址来操作的
var num =12;
var obj = {name:'hulongfei',age:27};
function fn(){
console.log(this is sunday!);
}
console.log(fn); //把整体函数打印出来
console.log(fn()); //把当前函数执行的结果return后面的值输出出来,不写默认返回undefined
1.当浏览器加载html页面的时候,首先会提供一个供全局js代码执行的环境 -> ‘全局作用域(global/window)’
2.预解释(变量提升):
在当前的作用域中,js代码执行之前,浏览器首先会把所有带var和function的进行提前的声明或者定义
1):理解声明和定义
var num =12;
声明(declare):var num; 告诉浏览器在全局作用域中有一个num变量
如果一个变量只是声明了但是没有赋值,默认的值是undefined
定义(defined): num =12; 给我们的变量进行赋值
2):对于带var和function关键字的在预解析的时候操作还是不一样的
var -> 在预解析的时候只是提前声明
function -> 在预解析的时候提前的声明+定义都完成了
3):预解释只发生在当前的作用域下,例如:开始只对window下的进行预解释,只有函数执行的时候才会对函数中的进行预解释
3.js中内存的分类
栈内存:用来提供一个供js代码执行的环境 ->作用域(全局作用域/私有作用域)
堆内存:用来存储引用数据类型的值、对象存储的时候属性名和属性值,函数存储的时候代码字符串
作用域链
console.log(total); //undefined
var total = 0;
function fn(num1,num2){
console.log(total);
var total = num1 + num2;
console.log(total);
}
fn(100,200); //函数的功能和结果区分开,函数执行输出0,300, 结果返回undefiend
console.log(total); //0 外部访问的是外部的变量0
1.如何区分私有的和全局的变量?
1):在全局作用域下声明的变量是全局变量
2):在'私有作用域中声明的变量'和'函数的形参'都是私有的变量
在私有作用域中,我们代码执行的时候遇到一个变量,首先我们要确定它是否为私有的变量,
如果是私有的变量,那么和外面的任何东西都没有关系;如果不是私有的,则往当前作用域的上级作用域进行查找,
如果上级作用域也没有则继续查找,一直找到window为止,这个过程叫 -> ‘作用域链’
2.当函数执行的时候(直接目的:让函数体中的代码执行),首先会形成一个新的私有作用域,然后按照以下步骤执行:
1):如果有形参先给形参赋值
2):进行私有作用域的预解释
3):私有作用域的代码从上到下执行
3.闭包只是一种'机制'
函数形成一个新的私有作用域保护了里面的私有变量不受外界干扰,(外面的修改不了私有的,私有的也改变不了外面的) -> '闭包'
console.log(total); //undefined
var total = 0;
function fn(num1,num2){
console.log(total);
total = num1 + num2;
console.log(total);
}
fn(100,200); //0 300
console.log(total); //300
网友评论