深究JavaScript

JavaScript函数(类比php)

2016-08-17  本文已影响73人  王中阳

默认参数

  1. 和php中一样,还没有一种语法允许一个函数参数带有默认值。(咱们可以这么玩)
function sum(a,b){
    b = typeof b === "undifine" ? 2 : b;
    return a + b;
}

sum(3,0); //3
sum(3); //5

任意多个参数

  1. js对函数的参数要求不严格,不一定非要传递指定个数的参数
  2. 多余的参数会被忽略掉,看下面的例子
sum();//NaN
sum(1,2);//3
sum(1,2,100,300);//3
  1. 在php中,用func_get_args(),它返回传递给函数的参数的一个数组。
  2. arguments(技术拔高)
function sum(){
    for(var i = 0,result = 0;i < arguments.length; i++){
        result += arguments[i];
    }
    return result;
}

sum();//0
sum(1);//1
sum(1,2);//3
sum(1,2,3);//6
sum(1,2,3,4);//10
sum(1,2,3,4,5);//15
function sum(){
    var args = Array.prototype.slice.call(arguments);
    var a = typeof arguments.push;
    var b = typeof args.push;
    console.log(a); //undefine
    console.log(b); //function
}

sum();
- slice() 方法可从已有的数组中返回选定的元素
- prototype 属性使您有能力向对象添加属性和方法。

arguments.length的技巧

  1. 聪明的方法实现带默认值的函数
function sum(a,b,c,d){
    switch(arguments.length){
        //注意:都不加break
        case 0: a=1;
        case 1: b=2;        
        case 2: c=3;        
        case 3: d=4;        
    }
    return a+b+c+d;
}

sum();//10
sum(1);//10
sum(11);//20
sum(11,22);//40

返回值

  1. js的函数总是会返回一个值。如果一个函数不使用return语句,那么会隐式的返回值undefine

函数是对象(重点)

function sum(a,b){ 
    return a + b;
}

sum.length; //2 -->该函数的参数个数
sum.call(null,2,3);//5
sum.apply(null,[2,3]);//5 apply()接收的参数以数组的方式传递
call_user_func('sum',2,3);
call_user_func_array('sum',array(2,3));

php语法详解

不同的语法

var sum = function(a,b){
    return a+b;
};

sum(1,2); //3

function sum(a,b){
    return a+b;
}

sum(1,2); //3

var sum = function sum(a,b){
    return a+b;
}

sum.name; //sum

var sum = function(a,b){
    return a+b;
}

sum.name; //""

作用域

  1. javascript中没有块作用域,只有函数作用域。
  2. 在一个函数中定义的任何变量,对于函数来说都是局部的,而且无法在函数之外看到它。
  3. 全局变量是那些在任何函数之外定义的变量。
if(true){
    var true_global = 1;
}

if(false){
    var false_global = 1;
}

function sum(){
    var local = 1;
    is_local = 1;
    return true_global+local+is_local;
}

console.log(true_global);//1
console.log(false_global);//undefined
console.log(local); //ReferenceError: local is not defined
console.log(is_local); //ReferenceError: is_local is not defined

sum();

console.log(true_global);//1
console.log(false_global);//undefined
console.log(local); //ReferenceError: local is not defined
console.log(is_local);//1 is_local漏掉了var,全局命名空间被污染

总结

提升

var a = 1;
function hoistingTest(){
    console.log(a);
    var a = 2;
    console.log(a);
}

hoistingTest(); //先显示"undefine" 再显示2
function hoistingTest(){
    var a;
    console.log(a);
    a = 2;
    console.log(a);
}
  1. 在顶部声明所有变量(可以看做类似定义一个php类并且所有属性都放到类的顶部,而不是散乱到方法里)
  2. 在需要的变量的时候才去定义它

提升函数

//全局作用域
function declare(){} 
var express = function(){};

(function(){
    //局部作用域
    console.log(typeof declare);//function
    console.log(typeof express);//undefine
    
    function declare(){}
    var express = function(){};
    
    console.log(typeof declare);//function
    console.log(typeof express);//function
}());
(function(){
    var express = undefined;

    //局部作用域
    console.log(typeof declare);//function
    console.log(typeof express);//undefined
    
    function declare(){}
    express = function(){};
    
    console.log(typeof declare);//function
    console.log(typeof express);//function
}());


一个敲代码,爱分享的人,我在这里!

来玩啊
上一篇下一篇

猜你喜欢

热点阅读