重学javascript笔记
一.in属性用法
判断某一个属性是否属于该对象,属于返回true不属于返回false。
var obj = {name:'feiwu',age:25}
console.log('name' in obj) //true
console.log('say' in obj) //false
二.预解释在条件控制语句中
1)不管条件是否成立都会把带var的变量进行提前声明(预解释)
if(!('total ' in window)){
var total = 999;
}
console.log(total) //undefined
上面的代码因为total进行了预解释,所以‘total’ in window为true对其进行取反if里面的条件为false,所以最后输出为undefined
三.匿名函数的预解释
预解释的时候只预解释等号左边的不预解释等号右边的值。
fn() //Uncaught ReferenceError: fn is not defined at <anonymous>:1:1
var test = function(){
console.log('test')
}
四.自执行函数下的预解释
自执行函数不进行预解释,因为自执行函数的定义和调用同时发生。
五.return下的变量预解释
return下声明的变量仍然会进行预解释
function test(){
console.log(total) //undefined
return function(){ //return 后面的为值所以不进行预解释
}
var total = 0;
}
test();
六.在预解释的时候如果名字相同了则不会重复预解释,但是会重新赋值
在js中如果变量的名字和函数的名字重复了也算冲突
fn() //2
1)function fn(){console.log(1)}
fn() //2
2)var fn = 10;
fn() //Uncaught TypeError: fn is not a function a <anonymous>:5:1
3)function fn(){console.log(2)}
fn()
js代码从上 到下执行之前进行预解释,1)函数预解释声明+定义,因为2)函数和1)函数名字相同所以不需要再重新声明,3)函数也是函数名相同也不进行重新声明但是会重新对fn函数重新赋值,预解释完成之后代码从上到下执行第一次输出2,第二次还是输出2第三次因为代码执行fn等于10相当于10()执行,10不是函数所以报错,报错之后导致代码无法进行正常执行。