Functions 函式
[function宣告方式]
function
function在執行前會先被解析,所以放在哪都沒關係
console.log('==start|');
foo();
console.log('|end==');
function foo(){ console.log('call function'); }
// ==start|call function|end==
匿名函式
把一個 匿名 函式賦值給變數
console.log('==start|');
foo();
console.log('|end==');
var foo = function(){ console.log('call function'); }
由於 var 已經宣告變數 foo 在所有的程式碼執行之前。 所以 foo已經在程式運行前就已經被定義過了。 但是因為賦值只會在運行時去執行,所以在程式碼執行前,foo 的值還沒被宣告所以為 undefined。所以會出錯。
命名函式的賦值表達式
將一個命名函式賦值給一個變數。
var foo = function bar() {
bar(); // 可以運行
}
bar(); // 錯誤:ReferenceError
bar 不可以在外部的區域被執行,因為它只有在 foo 的函式內才可以去執行。 然而在 bar 內部還是可以看見。這是由於 JavaScript的 命名處理所致。 函式名在函式內 都 可以去使用。
[this的原理]
JavaScript 有移到完全部屬於其他語言處理 this 的處理機制。
在 五 種不同的情況下, this 指向的個不相同
全域變數
var partent = 'body';
function call(){
console.log('call method');
}
//==done==//
console.log(this.partent); //body
this.call(); //call method
如果再全域範圍內使用 this,會指向 全域 的物件
呼叫一個函式(method)
var partent = 'body';
function call(){
console.log('call method');
}
function foo(){
var partent = 'foo';
console.log(partent); //foo
console.log(this.partent); //body
this.call();
}
//==done==//
console.log(this.partent); //body
this.call(); //call method
foo(); //foo,body,call method
這裡 this 也會指向 全域 對象。
注意:
在嚴格模式下,不存在全域變數。 this 將會是 undefined。
方法調用(object method)
var partent = 'body';
function call(){
console.log('call method');
}
var test_obj = {
'partent' : 'foo',
'call' : function(){
console.log('call method in test_obj');
},
'foo' : function(){
console.log(this.partent); //foo
this.call(); //call method in object
}
}
//==done==//
console.log(this.partent); //body
this.call(); //call method
test_obj.foo(); //foo,call method in test_obj
這個例子中, this 指向 test_obj 物件。
補充:
var test_obj2 = test_obj;
test_obj2.partent = 'foo2';
//==done==//
test_obj.foo(); //foo2,call method in test_obj
test_obj2.foo(); //foo2,call method in test_obj
不同於建構函式,如果只定另一個變數test_obj2等於test_obj
test_obj2的改變也會影響原本的test_obj....
呼叫一個建構函式(new object)
建構函式 : 如果函式傾向用 new 關鍵詞使用,我們稱這個函式為 建構函式。
var partent = 'body';
function call(){
console.log('call method');
}
function foo(){
console.log(partent); //body
call(); //call method
console.log(this.partent); //foo
this.call(); //call method in foo
}
foo.prototype.partent = 'foo';
foo.prototype.call = function(){
console.log('call method in foo');
};
var test_obj = new foo();
test_obj.partent = 'change on obj';
var test_obj2 = new foo();
test_obj2.partent = 'change on obj2';
//==done==//
console.log(this.partent); //body
this.call(); //call method
new foo(); //body,call method, foo,call method in foo
console.log(test_obj.partent); //change on obj =>不影響原本的foo和其他
console.log(test_obj2.partent); //change on obj2 =>不影響原本的foo和其他
在函式內部, this 指向 新物件的創立。
所以如果一個變數new自foo,該變數的參數改變不影響其他
顯示的設置 this
當使用 function.prototype 上的 call 或 apply 方法時,
函式內的 this 將會被 顯示設置 為函式調用的第一個參數。
function foo(){
console.log(this);
}
foo.apply('apply'); //執行foo,自動抓第一個参數為this
這個有點看不懂...
基本上應該是說真對一個method,指定一個不存在的prototype method,this是輸入參數的第一個參數