首先先了解一個知識點:in: "num" in window, 判斷num是否是window這個對象的一個屬性,是的話返回true,不是的話返回false。
var obj = {
name: 'derrick',
age: 20
};
console.log('name' in obj); // -> 返回true
console.log('eat' in obj); // -> 返回false
預(yù)解釋的時候不管條件是否成立,都要把帶var的進行提前的聲明
window的預(yù)解釋: var num; -> 給window.num;。
if (!("num" in window)) { // false
var num = 12;
}
console.log(num); // -> undefined
預(yù)解釋的時候,只對"="左邊的預(yù)解釋,右邊的是值,不參與預(yù)解釋
**匿名函數(shù)之函數(shù)表達式: **把函數(shù)的定義的部分當(dāng)做一個值賦值給變量/ 元素的某一個事件。
window下的預(yù)解釋: var fn;。
fn(); // -> undefined() -> TypeError
// 相當(dāng)于: var fn; fn() -> 出錯
var fn = function () {
console.log('ok');
}
自執(zhí)行函數(shù)定義的那個function在全局作用域下不進行預(yù)解釋,當(dāng)代碼執(zhí)行到這個位置的時候,定義和執(zhí)行一起完成了
// 自執(zhí)行函數(shù):定義和執(zhí)行一起完成了
(function (num) {
console.log(num);
})(100);
函數(shù)體中,return下面的代碼,雖然不再執(zhí)行了,但是需要進行預(yù)解釋;return后面跟著的是函數(shù)返回值,所以不進行預(yù)解釋
function fn() {
// 預(yù)解釋: var num;
console.log(num); // -> undefined
return function () {
// 這里不進行預(yù)解釋
}
var num = 100;
}
fn();
在預(yù)解釋的時候,如果名字已經(jīng)聲明過了,不需要重新的聲明,但是需要重新的賦值
在JavaScript中,如果變量的名字和函數(shù)的名字重復(fù)了,也算沖突。
預(yù)解釋: var fn; window.fn; fn = xxxff000; window.fn = xxxff000;。
var fn = 12;
function fn() {
console.log('ok');
}
console.log(fn); // 12
// window預(yù)解釋:
// 聲明+定義: fn = xxxff111
// 聲明 var fn; (不需要重新聲明)
// 聲明(不重新聲明)+定義: fn = xxxff222
// -> fn = xxff222
fn(); // -> 2
function fn() {
console.log(1);
}
fn(); // -> 2
var fn = 10;
fn(); // TypeError
function fn() {
console.log(2);
}
fn(); // -> 上面代碼出錯,此時不不執(zhí)行了