一、閉包Closures
#js中的閉包是函數(一個封閉的對外不公開的包裹結構或空間)
在函數外部存取不到函數內部的資料
要解決的問題就是需要在外部間接的存取函數內部的資料
function outer(){
var data = "数据"; return function(){
return data;
}
} function outer(){
var data = "数据"; return {
getData:function(){
return data;
},
setData:function(value){
data = value; return data;
}
}
}由于js是单线程执行的,会先执行主任务,然后执行次要任务(包括setTimeOut和setInterval中的回调函数中的代码)
例如:
for(var i = 0 ; i < 10; i++){
setTimeout(function(){
console.log(i);
},0);
}並不會如願印出1~10,而是印出10個10 因為for循環執行完畢後才會執行setTimeout回呼函數,如果時間到了就執行
for(var i = 0; i< 3; i++){ function foo(j){
return function(){
console.log(j);
};
} var f = foo(i);
setTimeout(f, 0);
}這樣印出來就是1 2 3
#閉包共享相同的函數定義,但是保存了不同的詞法環境
function makeSizer(size) {
return function() {
document.body.style.fontSize = size + 'px';
};
}var size12 = makeSizer(12);var size14 = makeSizer(14);var size16 = makeSizer(16);
document.getElementById('size-12').onclick = size12;
document.getElementById('size-14').onclick = size14;
document.getElementById('size-16').onclick = size16;點擊時文字會發生改變12、14、16
但是如果改變寫法:
function makeSizer(size) {
document.body.style.fontSize = size + 'px';
}這樣寫的話文字大小都是12,因為它們共享了同一個詞法環境,第一個執行後,後面和前面的是公用一個詞法環境
在建立新的物件或類別時,方法通常應該關聯於物件的原型,而不是定義到物件的建構器中。原因是這將導致每次構造器被呼叫時,方法都會被重新賦值一次(也就是,每個物件的創建)。
例如我們可以這樣寫:
function MyObject(name, message) {
this.name = name.toString(); this.message = message.toString();
}
MyObject.prototype.getName = function() {
return this.name;
};
MyObject.prototype.getMessage = function() {
return this.message;
};

相關推薦:
以上是js 閉包與原型的應用程式碼詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!