標籤:
函數調用:
/* 1. 函數調用 */
var temp = distance(0,1,2,3);
/* 2. 方法調用 */
this.CName = "全域";
var o = {
CName:"o類",
m:function(){
var self = this;
console.log(this == o); //true
console.log(this.CName); //o類
f();
function f(){
console.log(this == o);
//false,此this綁定到全域對象
console.log(this.CName);
//全域
console.log(self == o);
//true
console.log(self.CName);
//o類
}
}
};
o.m();
關於this:
一丶當它為一個對象上的方法的時候,this是當前這個對象。
二丶函數調用模式當函數並非一個對象的屬性時,那麼它被當做一個函數來調用。此模式下this綁定到全域對象。通過在對象內將this賦值給that,可以使函數模式下調用that來訪問指定對象。
函數的實參和形參:
/* 1. 可選形參 */
function getPropertyNames(o,a){
a = a||[];
for(var property in o){
a.push(property);
}
return a;
}
var a = getPropertyNames(o);
var b;
getPropertyNames(p,b); // 兩種調用
/* 2. 可變長實參 */
function max(){
var max = 0;
for(var i=0; i<arguments.length; i++){
if(arguments[i]>max){
max=arguments[i];
}
return max;
}
}
// 關於arguments
function test_1(a,b,c,d){
console.log(a,b,c,d); //1,2,3,4
for(var i=0; i<arguments.length; i++){
arguments[i] = 0;
}
console.log(a,b,c,d); //0,0,0,0
}
test_1(1,2,3,4);
//改變arguments[i]時,對應傳進去的參數也會改變
caller&callee:
// caller: 正在執行函數的函數
// callee: 正在執行的函數
function test_2(){
console.log("test_2");
function test_3(){
console.log("test_3");
function test_4(){
console.log("test_4");
//arguments.callee(); //這裡會迴圈調用test_4
//test_4.caller();//這裡回調到test_4調用者test_3
}
return test_4();
}
return test_3();
}
test_2();
// 還可以用來做遞迴
var plus = function(x){
if(x<=1) return 1;
return x*arguments.callee(x-1);
}
console.log(plus(5));
參數類型檢測:
isfinite(); // 是否有限數
isArrayLike(); // 是否是數組
函數的自訂屬性:
uniqueInterger.count = 0
// 給uniqueInterger函數定義了一個count屬性
function uniqueInterger(){
//var a="myfunc";
return uniqueInterger.count++;
}
console.log(uniqueInterger()); // 0
console.log(uniqueInterger()); // 1
console.log(uniqueInterger()); // 2
作為命名空間的函數:
function myModule(){
// 模組代碼
// 這個模組使用的變數都是局部變數
// 不會汙染全域命名空間
}
myModule() //別忘記調用這個函數
//或者更簡單的
(function(){
// 模組代碼
}());
JavaScript函數參數與調用