var a=100;
function a(){
console.log(a);
}
a();// a is not a function
原来
- 函数声明会置顶
- 变量声明也会置顶
- 函数声明比变量声明更置顶
- 变量和复制语句一起书写,在js引擎解析时,会将其拆成声明和赋值两个部分,声明置顶,赋值保留在原来的位置
- 声明或的变量不会重复声明
实际上这段代码等同于
var a; //函数声明
var a; //变量声明(实际上这里不会重复声明了)
a = function(){ console.log(a); }; //函数赋值
a = 100;//变量赋值(给a重新赋值了)
a()//a is not a function
而如果代码会如下写法则a方法会执行
var a; //函数声明
var a; //变量声明(实际上这里不会重复声明了)
a = 100;
a=function(){console.log(123)}//函数赋值
a()//123
一道有意思的题目
function Foo() {
getName = function () { alert (1); }; //运行这个函数重新赋值了 getName
return this;
}
Foo.getName = function () { alert (2);};
Foo.prototype.getName = function () { alert (3);};
var getName = function () { alert (4);};
function getName() { alert (5);}
//请写出以下输出结果:
Foo.getName(); // 3
getName(); // 4
Foo().getName(); // 1
getName(); // 1
new Foo.getName(); // 2
new Foo().getName(); // 3
new new Foo().getName(); // 3