(九)Function类型

2019-03-19  本文已影响0人  萘小蒽

1. Function类型特性

function addSomeNumber(num){
  return num +100;
}
function addSomeNumber(num){
  return num +200;
}
var num = addSomeNumber(100);//300
console.log(sum(1,2)); // 3
function sum(a,b){
  return a + b;
}

上面就是所谓的函数提升了,不多说了哈


2. 函数内部属性

在函数内部,有两个特殊的对象,argumentsthis,也规范化了一个属性caller.

function factorial(num){
    if(num<=-1){
         return 1;     
    } else{
         return num*factorial(num-1)
      }
  }

以上函数写法没有问题,但函数的执行与函数名factorial 紧紧耦合在了一起,为了消除这种耦合现象,可以如下写法:

function factorial(num){
    if(num<=-1){
         return 1;     
    } else{
         return num*arguments.callee(num-1)
      }
  }
  这样就可以避免函数名字的耦合带来的如下问题:
var trueFactorial = factorial;
factorial = function(){
  return 0
 };
trueFactorial(5);  // 120  
factorial(5);   // 0

上面的情况如果没有用到arguments.callee(),就不能完成递归调用。
还有匿名函数的自调用。


window.color = "red";
function sayColor(){
   console.log(this.color)
};
var o  = { color:" blue " };

sayColor()   //red
o.sayColor = sayColor;
o.sayColor()   // blue
function outer(){
  inner();
}
function inner(){
 console.log(inner.caller)  //arguments.callee.caller也是可以的。
}
outer();
//ƒ outer(){....}

3. 函数属性和方法

函数既然是对象,那么函数也有属性和方法。
每个函数都包含两个属性:lengthprototype.

function sayName (name){
  console.log(name);
}
function sum (num1,num2){
  return num1 + num2;
}
function sayHi (){
  console.log("hi");
}
console.log(sayName.length)  // 1
console.log(sum.length)    // 2
console.log(sayHi.length)  // 0


每个函数都包含两个非继承而来的方法,apply()call(),它们能够在特定的作用域中调用函数,也就是设置函数内部this的指向。

function sum (num1,num2){
    return num1 + num2;
}
function callSum1(num1,num2){
   sum.apply(this , arguments)
}
function callSum2(num1,num2){
   sum.apply(this ,[num1 , num2])
}
console.log(callSum1(10,10))   // 20
console.log(callSum2(10,10))   // 20

上面的apply()方法接收两个参数,一个是在其运行环境中的作用域,另一个是参数数组,数组可以是arguments,也可以是Array的实例。

function sum (num1,num2){
    return num1 + num2;
}
function callSum2(num1,num2){
   sum.call(this , num1 , num2)
}
console.log(callSum1(10,10))   // 20

call()方法和apply()方法的作用相同,他们的区别仅在于接收的参数不同。
而它们真正的用武之地是能够扩充函数赖以运行的作用域。

window.color = "red";
var o  = {color:"blue"}
function sayColor(){
   console.log(this.color)
}
sayColor() //red
sayColor.call(this)        //red
sayColor.call(window)     //red
sayColor.call(o)         //blue

扩展

我们还可以调用Object的toString方法来判断任何类型

Object.prototype.toString.call()
Object.prototype.toString.call("你好呀") 
//"[object String]"
Object.prototype.toString.call(null)
//"[object Null]"
Object.prototype.toString.call([])
//"[object Array]"
Object.prototype.toString.call(NaN)
//"[object Number]"
Object.prototype.toString.call(false)
//"[object Boolean]"

上一篇下一篇

猜你喜欢

热点阅读