什么是javascript的预解释?
在当前作用域下,JS代码执行之前,浏览器会对带var的和function的进行声明或者定义。
当浏览器加载HTML页面的时候,首先会提供一个供全局js代码执行的环境——>全局变量作用域(global/window)
带var的只会声明不会定义,带function的会声明+定义。
在当前作用域下预解释完成之后就会执行JS代码。
预解释无节操5点(变量相关2点,函数相关3点)
变量预解释析2点:
已经声明的变量不能重复声明
2.只对=左边带var的进行声明,但是不定义
函数预解释3点
在if条件块中定义的函数,不管条件是否成立,都会进行预解释
警示:不要在if条件中定义函数,有兼容性问题。
2.函数return后面的语句不会进行预解析,但是return后面的语句会进行预解析
3.自执行函数不会进行预解析,执行的时候函数的声明+定义+调用同步完成
在预解释的时候函数的优先级要比变量高。、
新知识:in:"name" in obj 判断name是否为obj这个对象的一个属性,是的为true,不是为false。
例子:
var obj={name:"qiao",age:17};
console.log("name" in obj);
console.log("eat" in obj);
对于带var和function关键字的在预解释的时候的操作是不一样的:
var -->在预解释的时候只是提前的声明
function-->在预解释的时候提前声明和定义都完成。
预解释只发生在当前的作用域下,例如:开始只对windows下的进行预解释,只有函数执行的时候,才会对函数中的var进行预解释。
例子 windows下的变量
"n=12;
console.log(n);"
此时的n就是windows下的属性名。
js中内存的分类:
根据作用分为:
栈内存:用来提供一个供js代码执行的环境-->window全局作用域
堆内存:用来存储引用数据类型的值-->对象存储的是属性名 和属性值,函数存储的是代码字符串。
如何区分私有变量和全局变量?
a、在全局作用下声明(预解释的时候)的变量是全局变量;
b、在私有作用域中声明的变量和函数的形参都是私有的变量
当函数执行的时候(直接目的:让函数体中的代码执行),首先会形成一个新的私有的作用域,然后按照如下的步骤执行:
1、如果有形参,先给形参赋值
2、进行私有作用域中的预解释
3、私有作用域中的代码从上到下执行
1、预解释的时候,不管你的条件是否成立,都要把带var的进行提前的声明
"var n1;
if (!("n1" in window)) {
var n1=12;
}
console.log(n1);"
2、预解释的时候预解释"="左边的,右边的值是不参与预解释的。
匿名函数之函数表达式:把函数定义的部分当做一个值赋值给我们的变量/元素的某一个事件
"" fn();
function fn(){
console.log("on");
}
执行函数定义的那个function在全局作用域下不进行预解释,当代吗执行这个位置的时候定义和执行一起完成。
自执行函数:定义和执行一起完成
"(function(num){alert(num)})(100);
-function(num){alert(num)}(10);
+function(num){alert(num)}(20);
~function(num){alert(num)}(30);
!function(num){alert(num)}(50);"
4、函数体中return下面的代码虽然不执行,但是需要进行预解释。而return后面跟着的都是我们返回的值,所以不进行预解释。
" function fn() {
console.log(num);
return function(){
};
var num = 100;
console.log(num);
}
alert(fn());"
在预解释的时候,如果名字已经声明过了,不需要重新的声明,但是需要重新的赋值。
在js中如果变量的名字和函数的名字重复了,也算冲突
" alert(fn);
var fn=10;
function fn() {
return 12;
}"
"fn=10; var fn;
fn(); //2
function fn() {
console.log(1);
}
fn();//2
var fn=10;
10();
function fn() {
console.log(2);
}
fn();"