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是輸入參數的第一個參數

results matching ""

    No results matching ""