预解析-基础知识总结------彭记(010)
预解析
-系统会将function定义的函数提升到当前作用域最顶端
-还会将var的声明提升到当前作用域的最顶端
<script> /*test(); function test(){ console.log(123); } /!*系统会将function定义的函数提升到当前作用域最顶端*!/ function test(){ console.log(123); } test();*/ /*console.log(age); var age = 20;*/ /*系统还会将var的声明提升到当前作用域的最顶端*/ /*var age; console.log(age); age = 20;*/ //test();//456 /*1.函数同名的时候,后面声明的函数会将前面声明的函数覆盖*/ /*function test(){ console.log(123); } function test(){ console.log(456); }*/ /*2.变量和函数同名 /*alert(foo);//function foo(){} function foo(){} var foo = 2; function foo(){} //var foo = function(){} var foo; alert(foo)//2 foo=2*/ /*function foo() { /!*函数内部的变量名提升只会提升到当前函数的最顶端*!/ var num = 123; console.log(num); // 123 } foo(); /!*函数外部不能直接使用函数内部声明的成员*!/ console.log(num); // is not defined*/ /*var scope = "global"; function foo() { console.log(scope); //undefined var scope = "local"; console.log(scope); //local } foo();*/ /*---------*/ /*function foo() { /!*如果函数内部有某个成员,就会优先使用内部的成员,如果没有再使用外部声明的成员*!/ var scope; console.log(scope); //undefined scope = "local"; console.log(scope); // local } var scope; scope = "global"; foo();*/ /*var num = 123; function f1(num) { // 参数理解为:函数内部的一个变量 var num =456; console.log(num); //456 } /*函数表达式并不会被提升:因为函数是其中的值--相当于赋值操作*/ /*test(); var test = function(){ console.log(123); }*/ console.log(typeof ksdjgfyadsgfyj); //undefined /*条件表达式中的函数声明不会提升*/ console.log(typeof func); if(true){ function func(){ return 1; } } console.log(typeof func); </script>
综合变态面试题:
<script> function Foo() { getName = function(){ alert(1); }; return this; } Foo.getName = function() { alert(2); }; Foo.prototype.getName = function(){ alert(3); }; function getName(){ alert(5); } var getName; getName = function() { alert(4); }; /*构造函数的静态成员*/ Foo.getName(); // 2 getName(); // 4 /*将构造函数当成普通函数调用:this就是当前window对象 Foo().getName(); 》》 this.getName()*/ Foo().getName(); // 1 /*构造函数中将这个全局的成员重置了*/ getName(); // 1 console.log(new Foo.getName()); // 2 /*先创建对象,再使用对象调用函数*/ new Foo().getName(); // 3 console.log(new new Foo().getName()); //3 </script>