第一节:预解释作用域this原理及应用
课时4:预解释是一种毫无节操的机制
in:”num” in window判断num是否为window这个对象的一个属性,是的话返回true,不是的话返回false。
例如:
var obj = {name :"abc" ,age :7 };
console .log("name" in obj); // true
console .log("eat" in obj); // false
例题1:
if (!("num" in window )){
var num = 12 ;
}
console .log(num);
相当于:
var num; // window .num
if (!("num" in window )){
num = 12 ;
}
console .log(num); // undefined
预解释的时候,不管条件是否成立,都要把带var的进行提前的声明。
预解释的时候只预解释等号左边的,右边的是值,不参与预解释。
例题2:
fn ( );
var fn = function ( ){
console.log ("OK" );
};
匿名函数之函数表达式:把函数定义的部分当做一个值赋值给变量/元素的某一个事件。
自执行函数:定义和执行一起完成了
例如:
(function (num) )(100) ;
~function (num) (100) ;
+function (num) (100) ;
-function (num) (100) ;
!function (num) (100) ;
执行函数定义的那个function在全局作用域下不进行预解释,当代码执行到这个位置的时候定义和执行一起完成了。
函数体中的return下面的代码虽然不再执行,但是需要进行预解释;而return后面跟着的都是返回的值,所以不进行预解释。
例题3:
function fn () {
console.log(num);
return function () { };
var num = 100 ;
}
fn();
在js中,如果变量的名字和函数重复,也算冲突。在预解释时,如果名字已经声明过了,不需要重新声明,但是需要重新的赋值。
例题4:
fn ( );
function fn ( ){
console.log (1 );
}
fn ( );
var fn = 10;
fn ( );
function fn ( ){
console.log (2 );
}
fn ( );
相当于:
window 预解释:
声明+定义:fn=xxxfff111
声明:var fn;(不需要重新声明)
声明(不需要)+定义:fn=xxxfff222
又相当于:
fn =xxxfff222