一句话总结:谁调用它指向得就是谁(是否有调用者),无调用者默认是window
function f1(){ console.log(1) } var obj = { a: 1 } obj.f1(); //这里的f1被obj调用了,它指向了obj
预编译:
过程:定义var、function --> 逐行执行
也就是说js解析器会在页面正式运行之前,把用var、function等定义的变量和函数先保存在”仓库中“,当运行到需要使用这些变量和函数的时候,js解析器会首先去”仓库“中寻找,如果”仓库“中的值是未定义的,它就会直接返回undefined!
注意:全局变量和局部变量同名的坑:全局变量是不会作用于同名局部变量的作用域的
var a = 10; function test() { console.log(a); a = 100; console.log(this.a); var a; console.log(a); } test(); //undefined、10、100 //预解析过程 function test() { var a; console.log(a); // undefined a = 100; console.log(this.a);//无调用者,指向window.输出10 console.log(a); //100 }
var a = 100; (function() { var a = b = 100; //等价于b = 100; var a = b; })() console.log(b); //100 console.log(a); //10
//先在函数内部找b的定义,找不到就到外边找,就在全局创建了一个b