全局变量的细节问题
console.log(num); //undefined
var num = 12;
console.log(num2); //num2 is not defined
num = 12;
在全局作用域当中,带var和不带var的关系?
带var的可以进行预解释,所以在赋值的前面执行,不会报错
而不带var的是不能进行解释的,在前面执行会报错
var num = 12;
console.log(num); //12
首先相当于给全局作用域增加了一个全局变量num,但是不仅如此,也相当于给window增加了
一个属性名num2,属性值是12
num2 = 12;
console.log(num2);//12
num2=12相当于给window增加了一个叫做num2的属性名,属性值是12
function fn(){
console.log(total); //undefined
var total = 100;
}
fn();
console.log(total);//undefined
var total = 0;
function fn(){
console.log(total);//0
total = 100;
}
fn();
console.log(total);//100
var total = 0;
私有作用域出现的一个变量不是私有的,则往上级作用域进行查找,上级没有则继续向上查找,
一直找到window为止,如果window下也没有呢?
我们是获取值:console.log(total); //报错了
如果我们是设置值:total =100;相当于给window增加了一个属性名total,属性值是100
js如果在不进行任何特殊处理的情况下,上面代码报错,下面的代码都不执行了
预解释是一种毫无节操的机制
判断num是否为window这个对象的一个属性,是的话返回true,不是返回false
var boj = {
name:'hulongfei',
age:27
};
console.log('name' in obj); //true
console.log('it' in obj); //false
预解释的时候不管的条件是否成立,都要把带var的进行提前声明
if(!("num" in window)){
var num = 12;
}
console.log(num); //undefined
fn();
function fn(){
console.log('ok');
}
fn();
匿名函数之函数表达式
预解释的时候只预解释等号左边的,右边的值,不参与预解释
window下的预解释:var fn;
fn(); //fn is not a function
var fn = function(){
console.log('ok');
}
自执行函数:定义和执行一起完成了
在全局作用域下不进行预解释,当代码执行到这个位置的时候定义和执行就一起完成了
(function(num){})(100);
函数体中return下面的代码虽然不再执行了,但是需要进行预解释,return后面跟
着的都是我们返回的值,所以不进行预解释
function fn(){
console.log(num);
return function(){
}
var num = 100;
}
fn();
如果在预解释的时候名字已经声明过了,不需要重新声明,但是需要重新的赋值
在js 中如果变量的名字和函数的名字重复了,也算冲突,
var fn = 13;
function fn(){
console.log("ok");
}
fn();
function fn(){
console.log(1);
}
fn();
var fn = 10;
fn();
function fn(){
console.log(2);
}
fn();
网友评论