之前在調整JS代碼結構時,將一個變量從局部變量變成全局變量。
我的構造上這樣的
var map = new Map();
。。。。
function map() { this.initialize();}
map.prototype = {}
但是在調用JS會報錯,能得到的答案是初始化的時候,map沒有定義,不知道有沒有詳細點解釋。謝謝!
之前在調整JS代碼結構時,將一個變量從局部變量變成全局變量。
我的構造上這樣的
var map = new Map();
。。。。
function map() { this.initialize();}
map.prototype = {}
但是在調用JS會報錯,能得到的答案是初始化的時候,map沒有定義,不知道有沒有詳細點解釋。謝謝!
[code="java"]
var map = new Map();
function Map() {
//①
this.initialize();
}
//②
Map.prototype = {
initialize : function(){}
//,.....
}
//③
[/code]
这里的问题在于浏览器对于采用“函数式”定义的函数和采用“赋值式”定义的函数处理方式上略有不同。
[code="java"]
//函数式
function func() {}
[/code]
[code="java"]
//赋值式
func = function() {}
[/code]
首先,浏览器对js的执行是按其定义的顺序执行的,而对于以“函数式”声明的函数在处理上采用了类似于C的预处理,所以,即使先调用函数,后声明函数,如例子中这样也不会有错。如果把例子的方式改为“赋值式”,那的第一句执行就会出错。
当执行“new Map()”时,函数被调用,执行到“function Map()”,但是后面的“Map.prototype”还没有执行到(js的执行是顺序的),那么在Map函数内希望访问protoype上的属性也是不存在的,可以在①②③处分别增加
[code="java"]console.log(Map.prototype);[/code]
可以看到,前两个打印出的原型对象均不包含initialize,而第三个包含,这就是因为js代码顺序执行的缘故。